在熊猫中传播范围日期



我有一个带有值的"范围日期"列表。例如:

Start     End      Value
1/1/2017  10/1/2017  10
5/1/2017  8/1/2017   20
12/1/2017 13/1/2017  40

我想要作为输出的是一个数据帧(熊猫(,其日历从 1/1/201731/12/2017,其中每个值都添加到开始和结束之间的天数中。
我目前的解决方案是:
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. 

如果日期时间不重叠,则可以创建带有DatetimeIndexSeries,并将年份日期时间的所有缺失值相加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

最后用于数据帧rename_axisreset_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

最新更新