我试图从日期范围的末尾而不是开头进行聚合。尽管我认为将closed='right'添加到grouper中可以解决问题,但事实并非如此。请告诉我如何实现底部显示的所需输出,谢谢。

import pandas as pd
df = pd.DataFrame(columns=['date','number'])
df['date'] = pd.date_range('1/1/2000', periods=8, freq='T')
df['number'] = pd.Series(range(8))
df

    date                number
0   2000-01-01 00:00:00 0
1   2000-01-01 00:01:00 1
2   2000-01-01 00:02:00 2
3   2000-01-01 00:03:00 3
4   2000-01-01 00:04:00 4
5   2000-01-01 00:05:00 5
6   2000-01-01 00:06:00 6
7   2000-01-01 00:07:00 7

通过groupby和日期的聚合,我得到以下结果。由于我有8个日期,并且按3个期间进行分组,所以它必须选择是截断最早日期组还是截断最早日期组,并选择最早日期组(最早日期组的计数为2):
df.groupby(pd.Grouper(key='date', freq='3T')).agg('count')

date                number
2000-01-01 00:00:00 3
2000-01-01 00:03:00 3
2000-01-01 00:06:00 2

我想要的输出是截短最早的日期组:
date                number
2000-01-01 00:00:00 2
2000-01-01 00:02:00 3
2000-01-01 00:05:00 3

请让我知道这是如何实现的,我希望有一个参数,可以设置,我忽略了。注意,这类似于this问题,但我的问题是特定于日期截断。
编辑:要重新定义问题(感谢Alexdor),熊猫的默认行为是按句点[0,3],[3,6],[6,9]装箱,但我想按(-1,2],(2,5],(5,8)装箱

最佳答案

似乎grouper函数从您传递给它的序列中最早的时间开始构建垃圾箱。我看不出有什么办法能让它从最新的时间开始建造垃圾箱,但从零开始建造垃圾箱是相当容易的。

freq = '3min'

minTime = df.date.min()
maxTime = df.date.max()
deltaT = pd.Timedelta(freq)
minTime -= deltaT - (maxTime - minTime) % deltaT # adjust min time to start of first bin
r = pd.date_range(start=minTime, end=maxTime, freq=freq)

df.groupby(pd.cut(df["date"], r)).agg('count')

给予
date                                     date number
(1999-12-31 23:58:00, 2000-01-01 00:01:00]  2   2
(2000-01-01 00:01:00, 2000-01-01 00:04:00]  3   3
(2000-01-01 00:04:00, 2000-01-01 00:07:00]  3   3

10-07 19:07
查看更多