问题:使用panda——相对于每个组的最小/最大日期值,如何以每月(例如,最后一天索引)频率有效地用零值填充缺失的日期?
编辑不假定输入日期对应于其月份的最后一天。要解决此问题,请在下面的建议答案中添加以下行:
df.date = df.date + pd.offsets.MonthEnd(0)
如果没有此修复,用freq='M'填充值可能会导致NA的…!
注:熊猫版本0.24.2
输入示例:
data = [{'name': 'A', 'date': '2019-01-01', 'val': 10},
{'name': 'A', 'date': '2019-04-30', 'val': 2},
{'name': 'B', 'date': '2019-02-15', 'val': 6},
{'name': 'B', 'date': '2019-05-01', 'val': 5}]
df = pd.DataFrame(data)
date name val
0 2019-01-01 A 10
1 2019-04-30 A 2
2 2019-02-15 B 6
3 2019-05-01 B 5
请注意,输入中的日期不一定是其相应月份的第一天或最后一天。
所需输出示例
date name val
0 2019-01-31 A 10
1 2019-02-28 A 0
2 2019-03-31 A 0
3 2019-04-30 A 2
4 2019-02-28 B 6
5 2019-03-31 B 0
6 2019-04-30 B 0
7 2019-05-31 B 5
尝试次数:
以下代码在索引级别有效,但用NA填充所有内容:
df['date'] = pd.to_datetime(df['date'])
dg = df.groupby('name').apply(lambda x: x.reindex(pd.date_range(min(x.date), max(x.date), freq='M')))
也:
熊猫填充组中缺少的日期和值
上面链接的答案似乎不是相对于每个组,而是整个数据集的最小/最大日期值。
一个快速修复:
df.date = pd.to_datetime(df.date)
new_df = (df.set_index('date')
.groupby('name', as_index=False)
.apply(lambda x: x.resample('M').interpolate())
.reset_index(0, drop=True)
)
s = new_df['name'].isna()
new_df.loc[s, 'val'] = 0
new_df['name'] = new_df['name'].ffill()
输出:
name val
date
2019-01-31 A 10.0
2019-02-28 A 0.0
2019-03-31 A 0.0
2019-04-30 A 2.0
2019-02-28 B 6.0
2019-03-31 B 0.0
2019-04-30 B 0.0
2019-05-31 B 5.0
我会使用 groupby
、resample
和 asfreq
(编辑:当您在非月末日期更新问题时。我按照您的建议添加了 pd.offsets.MonthEnd
)
df.date = df.date + pd.offsets.MonthEnd(0)
(df.set_index('date').groupby('name').resample('M')
.asfreq(fill_value=0).drop('name',1)
.reset_index())
Out[550]:
name date val
0 A 2019-01-31 10
1 A 2019-02-28 0
2 A 2019-03-31 0
3 A 2019-04-30 2
4 B 2019-02-28 6
5 B 2019-03-31 0
6 B 2019-04-30 0
7 B 2019-05-31 5
问题内容: 我有一个数据框架,如下所示 我想做的是在date列中找到最小和最大日期,并扩展该列使其具有所有日期,同时为该列填写。所以所需的输出是 问题答案: 初始数据框: 首先,将日期转换为日期时间: 然后,生成日期和唯一用户: 这将允许您创建一个MultiIndex: 您可以使用它来重新索引您的DataFrame: 然后可以按用户排序:
问题内容: 这个问题已经在这里有了答案 : MySQL如何填充范围内的缺失日期? (5个答案) 2年前关闭。 我有这个查询,我想用一些值(例如零…)填充缺失的日期。 结果如下: 如何用零值填充缺失的日期?有人有主意吗? 我需要这些数据来进行 图表 预览。 问题答案: 通常,您可以使用以下方法在MySQL中生成一系列N个整数: 请注意,您联接的表(someTable)必须至少具有N行。 上面的-1是
问题内容: 我有一个收藏。 产品浏览 我有一个查询,用于获取特定产品的每日视图。 询问 当前结果 问题 问题是,这种聚合不会在有视图的几天内返回。这会导致数据显示不正确: 结果应该看起来像 PS:最好输入开始和结束日期以基于此范围输出结果 问题答案: 您需要几个额外的步骤来返回默认值。首先,你需要使用与设置为收集所有结果中的一个文件内。然后,您可以将$ map 与一组天作为输入。在其中,您可以使用
问题内容: 我想知道如何使用循环根据sql中各组的开始/结束日期来填充零值缺失日期,以便每个组中都有连续的时间序列。我有两个问题。 如何为每个组循环播放? 如何使用每个组的开始/结束日期来动态填写缺少的日期? 我的输入和预期输出如下所示。 输入: 我有一张表A喜欢 我还有一张表B,可用于与A左联接以填写缺少的日期。 如何使用A和B在sql中生成以下输出? 输出: 请给我您的代码和建议。提前非常感谢
假设我有以下数据。 我想用以前的值填充缺少的日期(按字段“g”分组)。例如,我想在上面的示例中添加以下主菜: 我该怎么做呢?
问题内容: 我有一个MySQL查询问题,该查询按工作日将表中的数据分组。 我需要它来填充数据中缺少的工作日,例如下面的SQL示例中的星期日(工作日7)。 SQL小提琴 MySQL 5.6模式设置 : 查询1 : 结果 : 我希望它也返回此行。 我的完整查询非常复杂,因此希望您能找到一个快速的解决方案。 问题答案: 正常方法是: