我试图从日期范围的末尾而不是开头进行聚合。尽管我认为将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