带有日期时间键和频率参数的 pd.Grouper 的意外行为

问题描述 投票:0回答:1

问题描述

使用具有定义频率的

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?如果是这样,您能解释一下这种分组逻辑背后的基本原理吗?

python pandas
1个回答
0
投票

锚定频率定义了周期的结束。因此,如果您希望月经在周六开始,您应该使用

W-FRI
:

freq = "W-FRI"
df.groupby(pd.Grouper(key="date", freq=freq)).ngroup()
© www.soinside.com 2019 - 2024. All rights reserved.