我有一个带有日期时间的值列表:
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解决方案。
答案 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
,空Series
和ndarrays
乘以1,我们会自动获得您希望的缺失组被1填充的行为。
import numpy as np
np.prod(pd.Series())
#1.0
np.prod(np.ndarray(shape=0))
#1.0