Pandas时间序列:获取滚动窗口最大值对应的最晚出现日期
实现滚动窗口内最高价最晚出现日期的计算方法
首先保证数据预处理正确:
- 数据集必须按
Date字段升序排列,否则滚动窗口的时间顺序会出错 - 把
Date字段转为pandas datetime类型,方便后续日期操作
import pandas as pd # 预处理 df = df.sort_values('Date').reset_index(drop=True) df['Date'] = pd.to_datetime(df['Date']) # 对齐你原有逻辑,排除当前行的影响,先做shift操作 shifted_high = df['High'].shift(1) shifted_date = df['Date'].shift(1)
接下来定义滚动窗口自定义计算函数,实现找最晚出现的最高价对应日期的逻辑:
def get_last_high_date(window): # 窗口数据全为空的场景(前N行窗口长度不足)直接返回空时间 if window.isna().all(): return pd.NaT # 获取当前窗口内的最高价 window_max = window.max() # 找到窗口内最后一个等于最高价的索引位置 last_max_index = window[window == window_max].last_valid_index() # 返回对应位置的日期 return shifted_date.loc[last_max_index]
最后应用到滚动窗口得到结果:
# 过去60天(不含当日)最高价的最晚出现日期 df['last_max_high_date_60'] = shifted_high.rolling(60).apply(get_last_high_date).map(pd.to_datetime) # 可以同步保留你原有逻辑的最高价计算结果 df['max_high_60'] = shifted_high.rolling(60).max()
补充说明:
- 前59行因为窗口长度不足60天,会返回空时间值
NaT,符合时间序列滚动计算的常规逻辑 - 如需调整窗口天数,直接修改
rolling()内的参数即可,比如计算30天窗口就改为rolling(30)
内容的提问来源于stack exchange,提问作者sirokinl
相关产品推荐
相关产品推荐

