我有类似以下时间序列的内容:
ts = pd.Series(index=['2017-01-01','2017-01-03', '2017-01-10'], data=[100,200,500])
ts.index=pd.to_datetime(ts.index)
ts
Out[92]:
2017-01-01 100
2017-01-03 200
2017-01-10 500
dtype: int64
我想在接下来的4天内分发每天的价值。例如,在2017-01-01,2017-01-02,2017-01-03,2017-01-04和2017-01-05的每个日期中,100将分配为20。
我可以达到以下目的:
days_to_spread_over = 4
results=[]
for datevalue, value in ts.iteritems():
new = pd.Series(index = pd.date_range(start=datevalue, end = datevalue+timedelta(days=days_to_spread_over), freq='D'),
data = [value/float(days_to_spread_over+1)]*(days_to_spread_over+1))
results.append(new)
f = pd.concat(results).groupby(level=0).sum()
print f
2017-01-01 20.0
2017-01-02 20.0
2017-01-03 60.0
2017-01-04 60.0
2017-01-05 60.0
2017-01-06 40.0
2017-01-07 40.0
2017-01-10 100.0
2017-01-11 100.0
2017-01-12 100.0
2017-01-13 100.0
2017-01-14 100.0
dtype: float64
使用pandas时间序列功能有更好的方法吗?
答案 0 :(得分:2)
您可以使用除法后跟np.repeat
调用来优化值的计算,但计算日期范围将需要循环。
毫无疑问,这是一种更清洁的方式。首先,通过执行除法计算系列的值,然后重复5
次(分散的天数 -
i = (ts.values / 5).repeat(5)
现在,在每个索引上运行一个循环,调用pd.date_range
并将值添加到列表j
-
j = []
for x, y in zip(ts.index, ts.index + pd.Timedelta(days=4)):
j.extend(pd.date_range(x, y))
现在,初始化您的系列,然后执行groupby
。
pd.Series(i, index=j).groupby(level=0).sum()
2017-01-01 20.0
2017-01-02 20.0
2017-01-03 60.0
2017-01-04 60.0
2017-01-05 60.0
2017-01-06 40.0
2017-01-07 40.0
2017-01-10 100.0
2017-01-11 100.0
2017-01-12 100.0
2017-01-13 100.0
2017-01-14 100.0
dtype: float64
i
array([ 20., 20., 20., 20., 20., 40., 40., 40., 40.,
40., 100., 100., 100., 100., 100.])
j
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-03', '2017-01-04', '2017-01-05',
'2017-01-06', '2017-01-07', '2017-01-10', '2017-01-11',
'2017-01-12', '2017-01-13', '2017-01-14'],
dtype='datetime64[ns]', freq=None)
答案 1 :(得分:1)
我将使用gross
+ apply
groupby