熊猫分发时间序列数据

时间:2018-01-10 01:25:31

标签: python pandas

我有类似以下时间序列的内容:

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时间序列功能有更好的方法吗?

2 个答案:

答案 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