扩大 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
组和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
【讨论】:
哇哦,一个班轮! 1D 是指 1 天吗?如果我有相同类型的数据,但想要月初日期怎么办? 是的,检查别名pandas.pydata.org/pandas-docs/stable/…以上是关于扩大 Pandas 日期范围的主要内容,如果未能解决你的问题,请参考以下文章