如何按每N天分组选取对应周期内的最高Price值
按N天周期分组取最高Price实现方法
前置处理
首先需要将Date列转换为pandas标准datetime格式,这是所有时间分组操作的前提:
import pandas as pd # 加载你的数据表,以下用你给出的样例数据做演示 df = pd.DataFrame( [ ["2022-05-11 04:00:00.0000000 +00:00", 1], ["2022-05-12 04:00:00.0000000 +00:00", 2], ["2022-05-13 04:00:00.0000000 +00:00", 3] ], columns=["Date", "Price"] ) # 解析带时区的时间戳,将Date列设为索引(resample接口要求时间列为索引) df["Date"] = pd.to_datetime(df["Date"]) df = df.set_index("Date")
两种核心分组场景实现
1. 互不重叠的固定N天周期分组
如果你的需求是把全量时间序列切成连续、互不重叠的N天块,取每个块内的最高Price,直接用pandas内置的resample方法即可,这也是最稳妥的实现,已经内置处理了时区、闰年、夏令时等时间边界问题:
# 替换为你需要的周期天数 n = 2 # 按n天周期分组,取每组Price最大值 period_max = df.resample(f"{n}D")["Price"].max().reset_index()
说明:resample默认以数据集内最早的时间戳作为第一个周期的起点,D频率默认对齐自然日零点,不需要额外做偏移调整。如果分组后出现无数据的空周期返回NaN,追加.dropna()即可过滤空组。
2. 滑动N天窗口分组
如果你的需求是每个时间点对应最近N天的滚动窗口内最高值(分组之间有重叠),使用rolling时间窗口实现:
n = 2 rolling_max = df.rolling(f"{n}D")["Price"].max().reset_index()
避坑提示
- 不要手动计算「日期差//N天」生成分组键,这种硬编码方式遇到时区偏移、夏令时切换、闰年闰秒时会出现分组错误,pandas内置的时间分组接口已经处理了所有这些边界情况。
- 如果时间列带时区信息,确保整列时区统一,否则时间类接口会抛出类型错误。
- 如果需要指定分组的锚点时间(比如固定以每月1号为起点切分N天周期),可以给
resample加origin参数调整起点,不需要手动计算偏移。
内容的提问来源于stack exchange,提问作者DavidHU
相关产品推荐
相关产品推荐

