在Pandas中以指定的间隔重新取样?

时间:2016-02-24 08:49:58

标签: python datetime pandas

更新:我已更新我的示例以澄清我的问题
我有一个带有日期索引和值的数据框,如:

            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转换上面的内容。

2 个答案:

答案 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