扩大 Pandas 日期范围

Posted

技术标签:

【中文标题】扩大 Pandas 日期范围【英文标题】:Expand Pandas date range 【发布时间】: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 是否支持更好的方法?

【问题讨论】:

类似于***.com/questions/42151886/…,但不完全相同。 【参考方案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

【讨论】:

哇哦,一个班轮! 1D 是指 1 天吗?如果我有相同类型的数据,但想要月初日期怎么办? 是的,检查别名pandas.pydata.org/pandas-docs/stable/…

以上是关于扩大 Pandas 日期范围的主要内容,如果未能解决你的问题,请参考以下文章

日期时间范围之间的 Python Pandas 累积列

从 Pandas HDF5 商店检索日期范围

Pandas df 中的日期范围。

Pandas 分别对每个类别的日期范围求和

遍历 Pandas Dataframe 中定义的日期时间索引范围

从 pandas 的时间序列范围中查找最小和最大日期