Pandas groupby聚合截断最早的日期而不是最早的日期

时间:2018-03-14 15:15:21

标签: python pandas aggregate pandas-groupby

我试图从日期范围的末尾而不是从头开始聚合。尽管我认为向石斑鱼添加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 可以解决问题,但事实并非如此。请让我知道如何在底部显示我想要的输出,谢谢。

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

通过groupby和聚合日期,我得到以下内容。由于我有8个日期,并且我按周期3进行分组,因此必须选择是截断最早的日期组还是最早的日期组,并选择最早的日期组(最早的日期组的计数为2) :

date                number
2000-01-01 00:00:00 2
2000-01-01 00:02:00 3
2000-01-01 00:05:00 3

我想要的输出是截断最早的日期组:

intent.putExtra("PUT_PHOTO", getListAndroid().get(position).getPhoto());
intent.putExtra("PUT_DESK", getListAndroid().get(position).getDesk());

请让我知道如何实现这一目标,我希望有一个可以设置的参数,我已经忽略了。请注意,这类似于this问题,但我的问题是特定于日期截断。

编辑:要重新构建问题(感谢Alexdor),pandas中的默认行为是按句点[0,3],[3,6],[6,9]进行分区,而是我想要bin (-1,2],(2,5),(5,8)

2 个答案:

答案 0 :(得分:1)

似乎石斑鱼功能会从您传递给它的系列中最早的时间开始构建垃圾箱。我无法从最新的时间看到一种方法来制作垃圾箱,但从头开始构建垃圾箱相当容易。

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

答案 1 :(得分:0)

这是一个黑客攻击,让你按照一个固定的组大小进行分组,从下到上计算。

from itertools import chain

def grouper(x, k=3):
    n = len(df.index)
    return list(chain.from_iterable([[0]*int(n//k)] + [[i]*k for i in range(1, int(n/k)+1)]))

df['grouper'] = grouper(df, 3)

res = df.groupby('grouper', as_index=False)\
        .agg({'date': 'first', 'number': 'count'})\
        .drop('grouper', 1)

#                  date  number
# 0 2000-01-01 00:00:00       2
# 1 2000-01-01 00:02:00       3
# 2 2000-01-01 00:05:00       3