我有一个日期时间的值列表:
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为空,则累积量为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按回收箱进行分类。但这也没能成功。感谢任何帮助,Numpy解决方案也欢迎。
发布于 2018-11-04 05:56:56
您可以使用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我们会自动得到您想要的缺少组被1填充的行为,因为使用prod、空Series和ndarrays乘以1。
import numpy as np
np.prod(pd.Series())
#1.0
np.prod(np.ndarray(shape=0))
#1.0https://stackoverflow.com/questions/53138024
复制相似问题