如何在pandas中固定09:30-16:00区间填充时间序列缺失值
Pandas固定交易时段时间序列缺失值补全方案
你的原有代码的问题在于groupby.resample默认以每个分组内的最小、最大时间戳作为采样的起止边界,因此当日最早数据晚于09:30时,不会生成开盘到最早数据之间的时间戳。
以下是两种高效的实现方案,都可以实现无论原始数据是否包含开盘收盘时间戳,都强制补全每日09:30-16:00区间的所有时间点:
方案1:预生成完整时间索引对齐(性能最优)
该方案直接提前生成所有交易日的完整交易时段时间序列,再和原始数据对齐,避免groupby内部的边界计算,数据量越大性能优势越明显。
import pandas as pd # 可按需调整的固定参数 TRADING_START = "09:30:00" TRADING_END = "16:00:00" update_interval = "5T" # 和你原有采样间隔参数保持一致 # 1. 提取原始数据中所有的唯一交易日 trade_dates = df_process['Exchange DateTime'].dt.date.unique() # 2. 生成所有交易日的完整时间戳列表 full_timestamps = [] for date in trade_dates: day_start = pd.Timestamp.combine(date, pd.Timestamp(TRADING_START).time()) day_end = pd.Timestamp.combine(date, pd.Timestamp(TRADING_END).time()) day_range = pd.date_range(start=day_start, end=day_end, freq=update_interval) full_timestamps.extend(day_range) full_time_index = pd.Index(full_timestamps, name='Exchange DateTime') # 3. 原始数据和完整时间索引对齐 df_process = df_process.set_index('Exchange DateTime') df_process_out = df_process.reindex(full_time_index) # 4. 按天分组向前填充缺失值 df_process_out = df_process_out.groupby(df_process_out.index.date, group_keys=False).ffill()
方案2:自定义groupby重采样逻辑(贴合原有写法)
如果更习惯原有groupby.resample的写法,可以自定义分组处理函数,手动指定每个交易日的采样起止边界:
TRADING_START = "09:30:00" TRADING_END = "16:00:00" update_interval = "5T" df_process['FillDate'] = df_process['Exchange DateTime'].dt.date df_process = df_process.set_index('Exchange DateTime') def resample_trade_day(group): trade_date = group.name day_start = pd.Timestamp.combine(trade_date, pd.Timestamp(TRADING_START).time()) day_end = pd.Timestamp.combine(trade_date, pd.Timestamp(TRADING_END).time()) # 指定重采样起始点为当日开盘时间 resampled = group.resample(rule=update_interval, origin=day_start).ffill() # 仅保留收盘时间之前的记录 return resampled[resampled.index <= day_end] df_process_out = df_process.groupby('FillDate', group_keys=False).apply(resample_trade_day).drop('FillDate', axis=1)
两种方案均兼容你原有的向前填充逻辑,也不会生成交易日之外的冗余时间戳。
内容的提问来源于stack exchange,提问作者Chris Bauer
相关产品推荐
相关产品推荐

