当前位置: 首页 > 知识库问答 >
问题:

熊猫通过缺少日期填写零 *定义者*组

公西浩
2023-03-14

问题:使用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')))

也:

熊猫填充组中缺少的日期和值

上面链接的答案似乎不是相对于每个组,而是整个数据集的最小/最大日期值。

共有2个答案

廖琨
2023-03-14

一个快速修复:

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
熊哲圣
2023-03-14

我会使用 groupbyresampleasfreq (编辑:当您在非月末日期更新问题时。我按照您的建议添加了 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 : 结果 : 我希望它也返回此行。 我的完整查询非常复杂,因此希望您能找到一个快速的解决方案。 问题答案: 正常方法是: