如何使用Python pandas DataFrame获取52周高低价对应日期
解决方案
你要拿到滚动252交易日(对应52周的交易日总数)窗口内最高价、最低价对应的日期,核心是定位窗口内极值对应的行索引(即日期),具体实现如下:
前置预处理
首先确保你的数据按交易日升序排列,且日期列转为datetime格式、设为索引(如果已经做过这步可以跳过):
import pandas as pd df = pd.read_csv(csv_file_name, engine='python') # 替换成你CSV文件中实际的日期列名,比如trade_date、Date等 df['date'] = pd.to_datetime(df['date']) df = df.set_index('date').sort_index()
原有高低价计算(和你现有逻辑一致)
df['52W H'] = df['HIGH'].rolling(window=252, center=False).max() df['52W L'] = df['LOW'].rolling(window=252, center=False).min()
计算极值对应日期
方法1:兼容所有pandas版本(通用写法)
用rolling.apply结合np.argmax/np.argmin拿到极值在窗口内的位置,匹配对应日期即可:
import numpy as np df['52W H date'] = df['HIGH'].rolling(252, center=False).apply( lambda x: x.index[np.argmax(x)] ) df['52W L date'] = df['LOW'].rolling(252, center=False).apply( lambda x: x.index[np.argmin(x)] )
方法2:pandas 1.1.0+版本推荐(性能更高)
新版本pandas的Rolling对象原生支持idxmax/idxmin方法,不需要自定义apply函数,数据量大的时候运行速度比方法1快数倍:
df['52W H date'] = df['HIGH'].rolling(window=252, center=False).idxmax() df['52W L date'] = df['LOW'].rolling(window=252, center=False).idxmin()
注意事项
- 上述逻辑默认返回窗口内第一次出现极值的日期,如果需要取最后一次出现极值的日期,可以在apply方法中反转窗口序列后计算位置,再做日期匹配。
- 前251行因为窗口长度不足252个交易日,返回值为空,和你现有52周高低价的空值逻辑完全对齐,不需要额外处理。
- 计算前必须确认数据按日期升序排列,否则滚动窗口范围、日期匹配结果都会出错。
内容的提问来源于stack exchange,提问作者Saorabh Kumar
相关产品推荐
相关产品推荐

