更新:我已更新我的示例以澄清我的问题
我有一个带有日期索引和值的数据框,如:
date | value |
------------+-------|
category
A 2016-01-04 | 6 |
2016-01-05 | 4 |
2016-01-07 | 16 |
2016-01-10 | 0 |
2016-01-12 | 7 |
B 2016-01-20 | 0 |
2016-01-22 | 8 |
2016-01-29 | 5 |
2016-01-30 | 4 |
我想重新采样数据框,但是在特定时间间隔内对每个类别说“2016-01-01”到“2016-01-31”,并用零填充所有Na值。
这就是我想要的:
date | value |
------------+-------|
Category
A 2016-01-01 | 0 |
2016-01-02 | 0 |
2016-01-03 | 0 |
2016-01-04 | 6 |
.....
2016-01-29 | 0 |
2016-01-30 | 0 |
2016-01-31 | 0 |
B 2016-01-01 | 0 |
2016-01-02 | 0 |
2016-01-03 | 0 |
2016-01-04 | 0 |
.....
2016-01-29 | 5 |
2016-01-30 | 4 |
2016-01-31 | 0 |
我可以通过这个来使它工作:(但它很慢。有更好的方法吗?) 将上表存储在名为data
的数据框中idx = pd.DatetimeIndex(start='2016-1-1', end='2016-1-31', freq='D')
df=pd.DataFrame(columns=['category','date','value'])
data.reset_index('category',inplace=True)
for a,b in data.groupby(['category']):
b.set_index('date',inplace=True)
b.reindex(idx,fill_value=0)
b.reset_index('date')
df=pd.concat([df,b])
这也浪费了很多记忆。 我不想先创建日期索引,然后添加值。 有没有办法使用resample转换上面的内容。
答案 0 :(得分:2)
我相信您要指定开始日期和结束日期,然后重新索引重新采样的数据(Pandas 0.17 +)。
#pragma
答案 1 :(得分:0)
解决方案是创建一个具有完整日期范围的数据框,填充0:
df2 = pd.DataFrame(0, index=pd.date_range('2016-01-01', '2016-01-31'), columns=['values'])
然后使用combine_first
在可用时填充原始值:
df.combine_first(df2)
输出:
values
2016-01-01 0
2016-01-02 0
2016-01-03 0
2016-01-04 6
2016-01-05 4
2016-01-06 0
2016-01-07 16