我有一个多索引数据帧,其中索引之一是Period或DateTime。它缺少一些值,如下所示:
dt = pd.DataFrame(zip(['x']*4+['y']*4,
range(8),
list(pd.period_range('2020-08-02T00:00:00', '2020-08-02T03:00:00', freq='H'))*2)
,columns=['a', 'b', 'd']).set_index(['a', 'd'])
dt = dt.drop([('x',pd.Period('2020-08-02 01:00', 'H')),
('y',pd.Period('2020-08-02 01:00', 'H'))])
dt
我想用NaN填充缺失的期间值。最终结果将是:
如果我有一个带有简单索引的时间序列,那将很容易:dt.resample('H').first()
。在这个多索引时间序列中应该如何做?
答案 0 :(得分:1)
我认为您可以简单地重置groupby
的索引:
dt = dt.reset_index("a").groupby("a").resample('H').first()
dt["a"] = dt["a"].ffill()
print (dt)
a b
a d
x 2020-08-02 00:00 x 0.0
2020-08-02 01:00 x NaN
2020-08-02 02:00 x 2.0
2020-08-02 03:00 x 3.0
y 2020-08-02 00:00 y 4.0
2020-08-02 01:00 y NaN
2020-08-02 02:00 y 6.0
2020-08-02 03:00 y 7.0
答案 1 :(得分:1)
根据您在Henry Yik的评论下,我假设所有时间序列都在同一范围内,所以我猜您可以使用reindex
并像这样创建MultiIndex.from_product
:
dt_ = dt.reindex(pd.MultiIndex.from_product(
[dt.index.get_level_values('a').unique(),
pd.date_range(dt.index.get_level_values('d').min(),
dt.index.get_level_values('d').max(),
freq='H')],
names=dt.index.names))
print(dt_)
b
a d
x 2020-08-02 00:00:00 0.0
2020-08-02 01:00:00 NaN
2020-08-02 02:00:00 2.0
2020-08-02 03:00:00 3.0
y 2020-08-02 00:00:00 4.0
2020-08-02 01:00:00 NaN
2020-08-02 02:00:00 6.0
2020-08-02 03:00:00 7.0