在熊猫中传播范围日期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在熊猫中传播范围日期相关的知识,希望对你有一定的参考价值。
我有一个带有值的“范围日期”列表。例如:
Start End Value
1/1/2017 10/1/2017 10
5/1/2017 8/1/2017 20
12/1/2017 13/1/2017 40
我想要的输出是一个数据帧(pandas),其日历时间为2017年1月1日至2017年12月31日,其中每个值都在开始和结束之间的范围内添加。 我目前的解决方案是: 1)创建日历数据框 2)使用np迭代日期和每个范围日期。可以在日历数据框中添加“值”。
你知道是否有其他方法来解决这个问题?
这是我想要的结果(带有2列的数据帧):
1/1/2017 10
2/1/2017 10
3/1/2017 10
4/1/2017 10
5/1/2017 10 + 20
6/1/2017 10 + 20
7/1/2017 10 + 20
8/1/2017 10 + 20
9/1/2017 10
10/1/2017 10
11/1/2017 0
12/1/2017 40
13/1/2017 10
14/1/2017 0
etc.
答案
如果日期时间不重叠,则可以使用Series
创建DatetimeIndex
并添加Series.reindex
的所有日期时间值:
df['Start'] = pd.to_datetime(df['Start'], format='%d/%m/%Y')
df['End'] = pd.to_datetime(df['End'], format='%d/%m/%Y')
s = pd.concat([pd.Series(r.Value,pd.date_range(r.Start, r.End)) for r in df.itertuples()])
s = s.groupby(level=0).sum()
#print (s)
rng = pd.date_range('2017-01-01', '2017-12-31')
s2 = s.reindex(rng, fill_value=0)
print (s2.head(15))
2017-01-01 10
2017-01-02 10
2017-01-03 10
2017-01-04 10
2017-01-05 30
2017-01-06 30
2017-01-07 30
2017-01-08 30
2017-01-09 10
2017-01-10 10
2017-01-11 0
2017-01-12 40
2017-01-13 40
2017-01-14 0
2017-01-15 0
Freq: D, dtype: int64
最后为DataFrame使用rename_axis
与reset_index
:
df = s2.rename_axis('dates').reset_index(name='values')
print (df.head(15))
dates values
0 2017-01-01 10
1 2017-01-02 10
2 2017-01-03 10
3 2017-01-04 10
4 2017-01-05 30
5 2017-01-06 30
6 2017-01-07 30
7 2017-01-08 30
8 2017-01-09 10
9 2017-01-10 10
10 2017-01-11 0
11 2017-01-12 40
12 2017-01-13 40
13 2017-01-14 0
14 2017-01-15 0
以上是关于在熊猫中传播范围日期的主要内容,如果未能解决你的问题,请参考以下文章