Pandas日度OHLCV数据周度重采样:周索引设为该周首个存在交易日
通用方法:基于现有日度数据实现周度重采样并设置实际首个交易日为索引
无需依赖特定市场的交易日历,直接利用日度数据本身已过滤非交易日的特性,就能实现需求。以下提供两种实用方案:
方法一:直接分组聚合(推荐)
通过周分组直接锁定每组的首个交易日作为索引,一步完成聚合和索引设置,逻辑直观高效。
import pandas as pd # 假设你的日度OHLCV数据DataFrame为df,索引是DatetimeIndex # 生成唯一周分组键:(年份, ISO周数),避免跨年周的歧义 df['year_week'] = df.index.to_series().apply(lambda dt: (dt.isocalendar().year, dt.isocalendar().week)) # 分组聚合OHLCV指标,同时提取每组首个交易日作为最终索引 weekly_df = df.groupby('year_week').agg( Open=('Open', 'first'), High=('High', 'max'), Low=('Low', 'min'), Close=('Close', 'last'), Volume=('Volume', 'sum') ) # 将分组键替换为每组的首个交易日日期 weekly_df.index = df.groupby('year_week').apply(lambda group: group.index[0]) # 可选:删除临时生成的year_week列 df.drop('year_week', axis=1, inplace=True)
优势:
- 完全基于现有日度数据,适配所有市场
- 避免重采样后再修正索引的额外步骤,代码简洁
方法二:重采样后修正索引
若习惯使用resample先完成聚合,再修正索引到实际首个交易日:
import pandas as pd # 先按周重采样(这里用W-MON锚定周一,可根据市场周起始调整为W-SUN等) weekly_resampled = df.resample('W-MON').agg( Open=('Open', 'first'), High=('High', 'max'), Low=('Low', 'min'), Close=('Close', 'last'), Volume=('Volume', 'sum') ) # 提取日度数据的索引数组,用于快速查找 daily_dates = df.index.values # 定义函数:找到给定周起始日对应的首个实际交易日 def map_to_first_trading_day(week_start): # 筛选日度数据中 >= 该周起始日的所有日期,取第一个 valid_dates = daily_dates[daily_dates >= week_start] return valid_dates[0] if len(valid_dates) > 0 else week_start # 修正周度索引 weekly_resampled.index = weekly_resampled.index.map(map_to_first_trading_day)
优势:
- 保留
resample的使用习惯,适合熟悉该方法的用户 - 同样不依赖外部交易日历,仅基于现有有效交易日数据
内容的提问来源于stack exchange,提问作者Py_Dream
相关产品推荐
相关产品推荐

