在使用Grouper的多个键时填写缺少的日期

时间:2019-10-09 10:13:11

标签: python-3.x pandas time-series pandas-groupby

我有一个时间序列数据集,其中包含3年中不同材料的消耗量。我正在尝试在物料级别汇总此数据集,其中包含每个月的消耗量。虽然我可以使用具有多个键的Grouper来执行此操作,但最终输出中缺少消耗0的月份。有人可以帮我包括这些月吗?

我尝试使用具有多个键的pandas Grouper。

grouper = pd.Grouper(key='Date',freq='MS')
consumption_grouped = consumption.groupby([pd.Grouper(key='Material'),grouper])['QtyConsumed'].sum().reset_index()

预期

Date          QtyConsumed
2017-08-01   -2.0
2017-09-01   -8.0
2017-10-01   -6.0
2017-11-01   -2.0
2017-12-01    0.0
2018-01-01   -3.0

实际

Date          QtyConsumed
2017-08-01   -2.0
2017-09-01   -8.0
2017-10-01   -6.0
2017-11-01   -2.0
2018-01-01   -3.0

如上所述,在“实际结果”中,缺少2017年12月1日的条目。

2 个答案:

答案 0 :(得分:1)

如果在输入MultiIndex的前两列中按DataFrame创建DatetimeIndex,首先仅由Material级按DataFrame.reset_index创建groupby,然后将sumDataFrameGroupBy.resampleprint (df) QtyConsumed Material Date mat1 2017-08-01 -2.0 2017-09-01 -8.0 2017-10-01 -6.0 2017-11-01 -2.0 2018-01-01 -3.0 mat2 2017-08-01 -2.0 2017-09-01 -8.0 2017-10-01 -6.0 2017-11-01 -2.0 2018-01-01 -3.0 mat3 2017-08-01 -2.0 2017-09-01 -8.0 2017-10-01 -6.0 2017-11-01 -2.0 2018-01-01 -3.0

df = (df.reset_index(level=['Material'])
        .groupby('Material')
        .resample('MS')['QtyConsumed']
        .sum()
        .reset_index())
print (df)
   Material       Date  QtyConsumed
0      mat1 2017-08-01         -2.0
1      mat1 2017-09-01         -8.0
2      mat1 2017-10-01         -6.0
3      mat1 2017-11-01         -2.0
4      mat1 2017-12-01          0.0
5      mat1 2018-01-01         -3.0
6      mat2 2017-08-01         -2.0
7      mat2 2017-09-01         -8.0
8      mat2 2017-10-01         -6.0
9      mat2 2017-11-01         -2.0
10     mat2 2017-12-01          0.0
11     mat2 2018-01-01         -3.0
12     mat3 2017-08-01         -2.0
13     mat3 2017-09-01         -8.0
14     mat3 2017-10-01         -6.0
15     mat3 2017-11-01         -2.0
16     mat3 2017-12-01          0.0
17     mat3 2018-01-01         -3.0

DatetimeIndex

print (df) Material QtyConsumed Date 2017-08-01 mat1 -2.0 2017-09-01 mat1 -8.0 2017-10-01 mat1 -6.0 2017-11-01 mat1 -2.0 2018-01-01 mat1 -3.0 2017-08-01 mat2 -2.0 2017-09-01 mat2 -8.0 2017-10-01 mat2 -6.0 2017-11-01 mat2 -2.0 2018-01-01 mat2 -3.0 2017-08-01 mat3 -2.0 2017-09-01 mat3 -8.0 2017-10-01 mat3 -6.0 2017-11-01 mat3 -2.0 2018-01-01 mat3 -3.0

df = (df.groupby('Material')
        .resample('MS')['QtyConsumed']
        .sum()
        .reset_index())
print (df)
   Material       Date  QtyConsumed
0      mat1 2017-08-01         -2.0
1      mat1 2017-09-01         -8.0
2      mat1 2017-10-01         -6.0
3      mat1 2017-11-01         -2.0
4      mat1 2017-12-01          0.0
5      mat1 2018-01-01         -3.0
6      mat2 2017-08-01         -2.0
7      mat2 2017-09-01         -8.0
8      mat2 2017-10-01         -6.0
9      mat2 2017-11-01         -2.0
10     mat2 2017-12-01          0.0
11     mat2 2018-01-01         -3.0
12     mat3 2017-08-01         -2.0
13     mat3 2017-09-01         -8.0
14     mat3 2017-10-01         -6.0
15     mat3 2017-11-01         -2.0
16     mat3 2017-12-01          0.0
17     mat3 2018-01-01         -3.0

additionalProperties: false

答案 1 :(得分:0)

您必须重新采样,而不是分组

df['Date']=pd.to_datetime(df['Date'])
df.set_index('Date').resample('MS').last().fillna(0).reset_index()

输入

          Date  QtyConsumed
0   2017-08-01  -2.0
1   2017-09-01  -8.0
2   2017-10-01  -6.0
3   2017-11-01  -2.0
4   2018-01-01  -3.0

输出

         Date   QtyConsumed
0   2017-08-01  -2.0
1   2017-09-01  -8.0
2   2017-10-01  -6.0
3   2017-11-01  -2.0
4   2017-12-01  0.0
5   2018-01-01  -3.0