【问题标题】:Pandas: How to fill missing period/datetime values in a multiindex time series?Pandas:如何在多索引时间序列中填充缺失的期间/日期时间值?
【发布时间】:2020-08-05 18:19:19
【问题描述】:

我有一个多索引数据框,其中一个索引是 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()。在这个多索引时间序列中我应该怎么做?

【问题讨论】:

    标签: pandas time-series missing-data


    【解决方案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
    

    【讨论】:

    • 不知道MultiIndex.from_product。我已经手动完成了。
    • pd.date_range 更改为 pd.period_range 以使其完美
    • @neves 是的,你在你的问题中使用了period_range,我不熟悉这个 Period 类,但与上面创建的 MultiIndex 的工作方式相同:)
    【解决方案2】:

    我认为您可以简单地重置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
    

    【讨论】:

    • 没错。或者 OP 可以简单地将set_index 放在“d”列中 :)
    • 不错!如果缺少的句点位于句点的末尾或开头,则不会生成 NaN 值。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2018-08-17
    • 2018-05-21
    • 2020-04-08
    • 2022-12-21
    • 2018-09-06
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多