因果重采样:对最后一个X <time_unit> </time_unit>求和

时间:2014-10-08 00:16:28

标签: python pandas

说我有以下值:

                                   money_spent
time                 
2014-10-06 17:59:40.016000-04:00      1.832128
2014-10-06 17:59:41.771000-04:00      2.671048
2014-10-06 17:59:43.001000-04:00      2.019434
2014-10-06 17:59:44.792000-04:00      1.294051
2014-10-06 17:59:48.741000-04:00      0.867856

我希望每{{}}}秒花费大量资金。更具体地说,对于输出中的每个时间戳,我需要在最后2秒内看到花费

当我这样做时:

2

我明白了:

df.resample('2S', how='last')

我的期望。首先,请注意重新采样的df中的第一个条目是 money_spent time 2014-10-06 17:59:40-04:00 2.671048 2014-10-06 17:59:42-04:00 2.019434 2014-10-06 17:59:44-04:00 1.294051 2014-10-06 17:59:46-04:00 NaN 2014-10-06 17:59:48-04:00 0.867856 ,但那是在时间2.671048,即使根据原始数据框,没有钱是花了。怎么可能?

3 个答案:

答案 0 :(得分:4)

尝试使用how=np.sum

df.resample('2S', how=np.sum, closed='left', label='right')

修改

至于closedlabel

表示:从左闭区间开始,并用间隔右端的日期标记。  (2秒,例如[1,1.2,1.5,1.9,2))。 并从docs

  

关闭:{'右','左'} bin间隔的哪一边被关闭

     

label:{'right','left'}使用

标记存储桶的bin边缘标签

答案 1 :(得分:1)

您可以将事件添加到框架中,这样每一美元花费的时间将在两秒后离开系统;那么你所需要的只是累积总和;

两个事件有可能重叠;在这种情况下,在最后一步之后,您需要.drop_duplicate时间索引,为money_spent的每个重复值取time的最后一个值:

>>> df
                            money_spent
time                                   
2014-10-06 21:59:40.016000        1.832
2014-10-06 21:59:41.771000        2.671
2014-10-06 21:59:43.001000        2.019
2014-10-06 21:59:44.792000        1.294
2014-10-06 21:59:48.741000        0.868

>>> xdf = df.copy()   # make a copy of the original frame
>>> xdf['money_spent'] *= -1  # negate the value of `money_spent`
>>> xdf.index += np.timedelta64(2, 's')  # move the time span 2 seconds 

现在,concat使用原始框架sort_index并找到累积总和:

>>> pd.concat([df, xdf]).sort_index().cumsum()
                            money_spent
2014-10-06 21:59:40.016000    1.832e+00
2014-10-06 21:59:41.771000    4.503e+00
2014-10-06 21:59:42.016000    2.671e+00
2014-10-06 21:59:43.001000    4.690e+00
2014-10-06 21:59:43.771000    2.019e+00
2014-10-06 21:59:44.792000    3.313e+00
2014-10-06 21:59:45.001000    1.294e+00
2014-10-06 21:59:46.792000   -4.441e-16
2014-10-06 21:59:48.741000    8.679e-01
2014-10-06 21:59:50.741000   -4.441e-16

有一个浮点精度错误显示为非常小的值,如-4.441e-16,否则数字对我来说是正确的:

>>> _['money_spent'].round(15)
2014-10-06 21:59:40.016000    1.832
2014-10-06 21:59:41.771000    4.503
2014-10-06 21:59:42.016000    2.671
2014-10-06 21:59:43.001000    4.690
2014-10-06 21:59:43.771000    2.019
2014-10-06 21:59:44.792000    3.313
2014-10-06 21:59:45.001000    1.294
2014-10-06 21:59:46.792000   -0.000
2014-10-06 21:59:48.741000    0.868
2014-10-06 21:59:50.741000   -0.000
Name: money_spent, dtype: float64

答案 2 :(得分:0)

返回数组中的第一个元素是2.67的原因是您使用last方法对how重新取样数据。如果您想要更改为第一个重新采样点的读取位置1.832128,请使用how='first' kwarg。