展开Pandas日期范围

时间:2017-09-11 17:17:50

标签: python pandas

我的数据看起来像这样。每行代表某个日期该ID的值。

db1_labels = db1.labels_
labels, counts = np.unique(db1_labels[db1_labels>=0], return_counts=True)
print labels[np.argsort(-counts)[:3]]

我需要扩展它,以便我有所有日子的行。每天的值应该是前一天的值(即,将上面的数据视为值的更新,以及下面的数据作为值的时间序列)。

ID   Date         Value
A    2012-01-05   50
A    2012-01-08   100
A    2012-01-10   200
B    2012-07-01   10
B    2012-07-03   20

目前,我的解决方案达到以下目的:

  • 按ID分组
  • 对于每个组,计算出最小和最大日期
  • 创建pd.date_range
  • 同时遍历行和日期范围,填充日期范围中的值,并在必要时将索引指针递增到行
  • 将所有这些日期范围附加到最终数据框

它可行,但似乎是一个非常糟糕的暴力解决方案。我想知道Pandas是否支持更好的方法?

2 个答案:

答案 0 :(得分:2)

Date已编入索引的数据框上使用resample ID组,ffill上使用value

In [1725]: df.set_index('Date').groupby('ID').resample('1D')['Value'].ffill().reset_index()
Out[1725]:
  ID       Date  Value
0  A 2012-01-05     50
1  A 2012-01-06     50
2  A 2012-01-07     50
3  A 2012-01-08    100
4  A 2012-01-09    100
5  A 2012-01-10    200
6  B 2012-07-01     10
7  B 2012-07-02     10
8  B 2012-07-03     20

答案 1 :(得分:1)

或者你可以试试这个( 注意 :这也可以用于消费数字列)。

df.Date=pd.to_datetime(df.Date)
df=df.set_index(df.Date)
df.set_index(df.Date).groupby('ID')\
   .apply(lambda x : x.reindex(pd.date_range(min(x.index), max(x.index),freq='D')))\
     .ffill().reset_index(drop=True)

Out[519]: 
  ID       Date  Value
0  A 2012-01-05   50.0
1  A 2012-01-05   50.0
2  A 2012-01-05   50.0
3  A 2012-01-08  100.0
4  A 2012-01-08  100.0
5  A 2012-01-10  200.0
6  B 2012-07-01   10.0
7  B 2012-07-01   10.0
8  B 2012-07-03   20.0