我有一个数据框,基本上是将几个时间序列叠加在一起。每个时间序列都有一个独特的标签(组),它们有不同的日期范围。
date = pd.to_datetime(pd.Series(['2010-01-01', '2010-01-02', '2010-01-03',
'2010-01-06', '2010-01-01', '2010-01-03']))
group = [1,1,1,1, 2, 2]
value = [1,2,3,4,5,6]
df = pd.DataFrame({'date':date, 'group':group, 'value':value})
df
date group value
0 2010-01-01 1 1
1 2010-01-02 1 2
2 2010-01-03 1 3
3 2010-01-06 1 4
4 2010-01-01 2 5
5 2010-01-03 2 6
我希望对数据进行重新采样,以便每个日期和组合都有一个条目(如果该天没有观测值或在日期范围之外,则填充NaN)。示例输出如下:
date group value
2010-01-01 1 1
2010-01-02 1 2
2010-01-03 1 3
2010-01-04 1 NaN
2010-01-05 1 NaN
2010-01-06 1 4
2010-01-01 2 5
2010-01-02 2 NaN
2010-01-03 2 6
2010-01-04 2 NaN
2010-01-05 2 NaN
2010-01-06 2 NaN
我有一个可行的解决方案,但我怀疑还有更好的方法。我的解决方案是首先对数据进行透视,然后取消堆叠、分组和重新采样。基本上,真正需要做的只是进行分组和重新采样,但需要指定重新采样的最大和最小范围,这些范围是整个日期列的最大和最小值,但我找不到任何方法来实现。
df = (df.pivot(index='dates', columns='groups', values='values')
.unstack()
.reset_index()
.set_index('dates')
.groupby('groups').resample('D').asfreq()
.drop('groups', axis=1)
.reset_index()
.rename(columns={0:'values'}))[['dates','groups', 'values']]
merge
。要获取所有“可能的日期”,可以基于您的date
列中的最小/最大值使用pandas.date_range
。 - Guybrush