【问题标题】:Impute missing dates to multilevel dataframe将缺失的日期归入多级数据框
【发布时间】:2019-03-16 01:18:08
【问题描述】:

我有一个如下的数据框:

import numpy as np
import pandas as pd
import datetime as dt

dates = ['2000-01-01', '2000-01-03', '2000-01-03', '2000-01-04']
dates_list =[ dt.datetime.strptime(date, '%Y-%m-%d').date() for date in dates]

df = pd.DataFrame(np.random.rand(4, 2),
                  index=[['a', 'a', 'b', 'b'], dates_list],
                  columns=['data1', 'data2'])

-

df
                  data1     data2
a   2000-01-01  0.928427    0.029868
    2000-01-03  0.243949    0.140281
b   2000-01-03  0.760319    0.897673
    2000-01-04  0.288415    0.919107

我想为每个索引值估算缺失的最大和最小日期行,并为数据列设置一些值(即 0)。这样我的数据框看起来像:

                data1   data2
a   2000-01-01  0.507132    0.649724
    2000-01-02  0.0         0.0
    2000-01-03  0.500277    0.859769
    2000-01-04  0.0         0.0
b   2000-01-01  0.0         0.0
    2000-01-02  0.0         0.0
    2000-01-03  0.136397    0.166815
    2000-01-04  0.102095    0.918545

我尝试过使用以下描述的方法: pandas fill missing dates in time seriesAdd missing dates to pandas dataframe 为:

 df.loc[dates_list]

->

 TypeError: unhashable type: 'DatetimeIndex'

但我无法让它为多级索引 df 工作。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用reindex

    id=df.index.get_level_values(1)
    idx=pd.MultiIndex.from_product([df.index.levels[0],pd.date_range(id.min(),id.max())])
    idx
    Out[325]: 
    MultiIndex(levels=[['a', 'b'], [2000-01-01 00:00:00, 2000-01-02 00:00:00, 2000-01-03 00:00:00, 2000-01-04 00:00:00]],
               labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 2, 3, 0, 1, 2, 3]])
    df=df.reindex(idx,fill_value=0)
    df
    Out[326]: 
                     data1     data2
    a 2000-01-01  0.898764  0.091644
      2000-01-02  0.000000  0.000000
      2000-01-03  0.397724  0.742387
      2000-01-04  0.000000  0.000000
    b 2000-01-01  0.000000  0.000000
      2000-01-02  0.000000  0.000000
      2000-01-03  0.187021  0.203479
      2000-01-04  0.231994  0.935882
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-16
      • 2013-10-19
      • 1970-01-01
      • 2020-04-10
      • 2021-04-06
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多