使用默认值添加缺失日期索引

时间:2018-11-28 06:35:14

标签: python pandas date

我有一个pandas数据框,其中的索引代表数据(按月格式),多列包含数字数据。最小示例如下:

 dict1 = [{'var0': 45, 'var1': 3, 'var2': 2},
     {'var0': 32, 'var1': 4, 'var2': 4},
     {'var0': 23, 'var1': 5, 'var2': 8},
     {'var0': 22, 'var1': 2, 'var2': 12},]
 df = pd.DataFrame(dict1, index=['2016-08', '2016-09','2016-11','2016-12'])

但是,缺少某些月份,也就是说,请注意索引是如何从9月跳到11月的。我想填充所有丢失的月份,以便新数据框包含该月份作为索引和零的其他行。在相应的行中,即:

  dict1 = [{'var0': 45, 'var1': 3, 'var2': 2},
     {'var0': 32, 'var1': 4, 'var2': 4},
     {'var0': 23, 'var1': 5, 'var2': 8},
     {'var0':  0, 'var1': 0, 'var2': 0},
     {'var0': 22, 'var1': 2, 'var2': 12},]
  df = pd.DataFrame(dict1, index=['2016-08'', '2016-09', '2016-09','2016-11','2016-12'])

任何人都可以推荐一种方法吗?

1 个答案:

答案 0 :(得分:2)

创建DatetimeIndex并使用DataFrame.asfreq

df.index = pd.to_datetime(df.index)
df = df.asfreq('MS', fill_value=0)

或将DataFrame.reindexpandas.date_range

df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq='MS'), fill_value=0)

print(df)
            var0  var1  var2
2016-08-01    45     3     2
2016-09-01    32     4     4
2016-10-01     0     0     0
2016-11-01    23     5     8
2016-12-01    22     2    12

使用month period的解决方案-使用DatetimeIndex.to_period创建pandas.period_range

df.index = pd.to_datetime(df.index).to_period('M')
df = df.reindex(pd.period_range(df.index.min(), df.index.max(), freq='M'), fill_value=0)
print(df)
         var0  var1  var2
2016-08    45     3     2
2016-09    32     4     4
2016-10     0     0     0
2016-11    23     5     8
2016-12    22     2    12

在必要时最后转换为字符串YY-MM并添加DatetimeIndex.strftime

df.index = df.index.strftime('%Y-%m')
print(df)
         var0  var1  var2
2016-08    45     3     2
2016-09    32     4     4
2016-10     0     0     0
2016-11    23     5     8
2016-12    22     2    12