【问题标题】:Expand Pandas date range扩大 Pandas 日期范围
【发布时间】:2018-02-20 00:21:09
【问题描述】:

我有这样的数据。每行代表该 ID 在某个日期的值。

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   Date         Value
A    2012-01-05   50
A    2012-01-06   50
A    2012-01-07   50
A    2012-01-08   100
A    2012-01-09   100
A    2012-01-10   200
B    2012-07-01   10
B    2012-07-02   10
B    2012-07-03   20

目前,我的解决方案如下:

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

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

【问题讨论】:

标签: python pandas


【解决方案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

【讨论】:

  • 嗯这与 OP 中的输出不匹配?
【解决方案2】:

Date 上使用resample 索引数据框和ID 组和ffillvalue

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

【讨论】:

猜你喜欢
  • 2018-10-24
  • 2012-11-06
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多