我正在尝试使用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')
由于我对最新的组感兴趣,所以我不在乎第一个(最早的)组是如何构建的。
我尝试了参数label
,closed
,convention
,loffset
,base
(文档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
,并保留最新数据: