我有一个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'])
任何人都可以推荐一种方法吗?
答案 0 :(得分:2)
创建DatetimeIndex
并使用DataFrame.asfreq
:
df.index = pd.to_datetime(df.index)
df = df.asfreq('MS', fill_value=0)
或将DataFrame.reindex
与pandas.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