分布时间序列d

2024-09-30 03:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下时间序列:

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

有没有更好的方法来使用熊猫时间序列功能?你知道吗


Tags: todataindexvalue时间序列daysresults
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)

我将使用apply+groupby

df=ts.to_frame('Val').reset_index()
df['index']=df['index'].apply(lambda x : pd.date_range(start=x,periods=5).tolist())
df.Val/=5
ts_new=df.set_index('Val')['index'].apply(pd.Series).stack().reset_index().groupby(0).Val.sum()
ts_new
Out[33]: 
0
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
Name: Val, dtype: float64

相关问题 更多 >

    热门问题