使用pandas Grouper对数据框进行分组时控制最后一行标签

我正在尝试使用Grouper将包含每日指标的数据框按30天的时间分组:

import random
import pandas as pd

n_rows = 100
df = pd.DataFrame({"date": pd.date_range(periods=n_rows, end='2020-04-15'), "a": range(n_rows)})
aggregated = df.groupby(pd.Grouper(key="date", freq="30D")).sum().reset_index()

print(aggregated.date.max()) 
# out: Timestamp('2020-04-06 00:00:00')

aggregates的最新日期随n_rows的变化而变化:我希望它始终是初始数据帧的最后日期,这样最后一个期间为('2020-04-15'-30D,'2020 -04-15')。我会得到:

print(aggregated.date.max()) 
# out: Timestamp('2020-04-15 00:00:00')

由于我对最新的组感兴趣,所以我不在乎第一个(最早的)组是如何构建的。

我尝试了参数labelclosedconventionloffsetbase(文档enter link description here)的组合,但找不到有效的解决方案:-我的第一种方法是尝试使用label="right"closed="right"以及convention来确保周期沿正确的方向构建,但没有任何效果:

aggregated = df.groupby(pd.Grouper(key="date", freq="30D", label="right", closed="right")).sum().reset_index()

print(aggregated.date.max()) 
# out: Timestamp('2020-04-16 00:00:00')
第二,我尝试使用参数 loffset=f"{n_rows % 30}D"和/或 base=+/- n_rows % 30偏移组而不影响起始日期,但仍然没有。 最后,我尝试构建自定义的 DateOffset对象,但找不到 Grouper的有效示例。

我现在想知道这是否可行,从那时起我有点惊讶。

我可以看的任何建议或类似示例吗?

谢谢!

2
投票

使用resample,您需要使用base参数来偏移垃圾箱。我们可以使用整个时间跨度的余数除法和频率来确定需要的时间。然后,选择正确的标签并在右侧关闭(因为它是最近的30D)

0
投票

一个简单的解决方案是填充或切片数据帧,使行数是频率的倍数。在我的情况下,我想将数据帧的大小减小到n_rows - n_rows % 30,并保留最新数据: