熊猫Groupby Dates,然后是Group Cumprod吗?

时间:2018-11-04 05:29:41

标签: python pandas numpy

我有一个带有日期时间的值列表:

     Datetime         Val 
[[2017-01-01 15:00:00, 2],
 [2017-02-05 19:00:00, 3],
 [2018-04-22 15:00:00, 6],
 [2018-08-02 13:00:00, 3],
 [2018-10-03 12:00:00, 3]]

我想按日期时间将值分组为N个等间隔的bin,然后获取每个组的val的累积值列表,如果组bin为空,则cumprod为1。

我当前的方法是计算第一个和最后一个时间戳,然后使用linspace来计算等距的日期时间仓,这就是我遇到的问题:

n = 5 # 5 equally sized bins
start = pd.Timestamp(df.iloc[0]['datetime'])
end = pd.Timestamp(df.iloc[-1]['datetime'])
bins = np.linspace(start.value, end.value, n+1) # n+1 as linspace is right bound including
groups = pd.to_datetime(bins).values

返回:

 ['2017-01-01T15:00:00.000000000' '2017-05-09T14:24:00.000000000'
 '2017-09-14T13:48:00.000000000' '2018-01-20T13:12:00.000000000'
 '2018-05-28T12:36:00.000000000' '2018-10-03T12:00:00.000000000']

具有5个等间距间隔的输出,上面给出的示例值可能是:

 output = [2*3, 1, 1, 6, 3*3] # 1 if there is no "Val" for a bin

是否有任何有效/清洁的方法来解决此问题?我已经研究了pd.Grouper,但是无法获得freq值来输出相等间隔的日期时间组。我尝试过的另一个解决方案是将日期时间转换为纪元,然后使用np.digitize按bin进行分类。但这也没有解决。感谢您的帮助,也欢迎Numpy解决方案。

1 个答案:

答案 0 :(得分:2)

您可以使用pd.cut轻松指定垃圾箱。然后,您需要groupby + prod

df.groupby(pd.cut(df.Datetime, bins=5, right=False)).Val.prod()

输出:

Datetime
[2017-01-01 15:00:00, 2017-05-09 14:24:00)           6
[2017-05-09 14:24:00, 2017-09-14 13:48:00)           1
[2017-09-14 13:48:00, 2018-01-20 13:12:00)           1
[2018-01-20 13:12:00, 2018-05-28 12:36:00)           6
[2018-05-28 12:36:00, 2018-10-04 03:21:25.200000)    9
Name: Val, dtype: int64

由于prod,空Seriesndarrays乘以1,我们会自动获得您希望的缺失组被1填充的行为。

import numpy as np

np.prod(pd.Series())
#1.0

np.prod(np.ndarray(shape=0))
#1.0