我有一个时间序列数据集,其中包含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日的条目。
答案 0 :(得分:1)
如果在输入MultiIndex
的前两列中按DataFrame
创建DatetimeIndex
,首先仅由Material
级按DataFrame.reset_index
创建groupby
,然后将sum
与DataFrameGroupBy.resample
和print (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