使用具有定义频率的
pd.Grouper
来对 pandas
中的日期进行分组时,会出现意外行为,即预期根据定义的频率起点分组到上一期间的日期反而分组为以下内容期间。
下面是使用
pandas
库演示该问题的 Python 代码片段:
import pandas as pd
import numpy as np
# Create a date range and dataframe
date_range = pd.date_range(start='2023-01-01', periods=10, freq='D')
data = {
'id': np.arange(1, 11),
'date': date_range,
'value': np.random.randint(1, 100, size=len(date_range))
}
df = pd.DataFrame(data)
df["dayweek"] = df["date"].dt.dayofweek
id | 日期 | 价值 | 每周 |
---|---|---|---|
1 | 2023-01-01 00:00:00 | 76 | 6 |
2 | 2023-01-02 00:00:00 | 47 | 0 |
# Define grouping frequency
freq = "W-SAT"
grouped_df = df.groupby(["id"] + [pd.Grouper(key="date", freq=freq)]).sum().reset_index()
id | 日期 | 价值 |
---|---|---|
1 | 2022-12-31 00:00:00 | 68 |
2 | 2022-12-31 00:00:00 | 82 |
grouped_df 输出错误地将 id=1 的日期(2023-01-01,星期日)映射到 2023-01-07,下一个周期的星期六,而不是预期的 2022-12-31,当前周期的星期六。
对于 id=1,日期 2023-01-01(星期日)在逻辑上应分组在从 2022-12-31(前星期六)开始的时间段下。
定义任何频率时,此行为是否适用于 pd.Grouper?如果是这样,您能解释一下这种分组逻辑背后的基本原理吗?
锚定频率定义了周期的结束。因此,如果您希望月经在周六开始,您应该使用
W-FRI
:
freq = "W-FRI"
df.groupby(pd.Grouper(key="date", freq=freq)).ngroup()