熊猫:如何在多索引时间序列中填写缺失的期间/日期时间值?

时间:2020-08-05 18:19:19

标签: pandas time-series missing-data

我有一个多索引数据帧,其中索引之一是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

mult-iindex dataframe with missing values

我想用NaN填充缺失的期间值。最终结果将是:

desired result

如果我有一个带有简单索引的时间序列,那将很容易:dt.resample('H').first()。在这个多索引时间序列中应该如何做?

2 个答案:

答案 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