Pandas日度OHLC股票数据重采样为月度时使用原始索引实际日期替代BM规则
实现方法
首先确保你的日度数据索引为datetime类型,若未转换先执行:
df_daily.index = pd.to_datetime(df_daily.index)
方法1:一步到位写法
import pandas as pd output = df_daily.groupby(pd.Grouper(freq='M')).apply( lambda x: pd.Series( { 'open': x['open'].iloc[0], 'high': x['high'].max(), 'low': x['low'].min(), 'close': x['close'].iloc[-1] }, name=x.index[-1] ) )
方法2:索引替换写法(适合不想使用自定义apply的场景)
# 第一步:先按正常逻辑计算月度OHLC数值 ohlc = df_daily.resample('M').agg({'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last'}) # 第二步:提取原始数据中每个月实际存在的最后一个交易日日期 month_last_dates = df_daily.groupby(pd.Grouper(freq='M')).apply(lambda x: x.index[-1]) # 第三步:替换索引为实际交易日日期 ohlc.index = month_last_dates output = ohlc
逻辑说明
两种写法的分组逻辑都和你之前使用resample('BM')的分组范围一致,区别仅在于最终索引直接取自原始数据当月最后一条记录的日期,不会生成原始数据中不存在的月末日期,OHLC的统计规则完全符合你的要求:
- open取当月第一个交易日的开盘价
- high取当月所有交易日的最高价
- low取当月所有交易日的最低价
- close取当月最后一个交易日的收盘价
两种写法运行后得到的结果都和你给出的预期输出完全匹配。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

