pandas时间序列分钟级补缺口避免生成非交易日数据的实现方法
解决思路
核心逻辑是按原始数据中存在的交易日分组处理,仅对有交易数据的日期单独做分钟级重采样,从根源上避免生成非交易日数据,同时大幅降低运算量。
实现代码
import pandas as pd # 1. 先将时间列转为datetime格式,若时间列实际名为Exchange DateTime,替换此处的Timestamp即可 df['Timestamp'] = pd.to_datetime(df['Timestamp']) # 2. 按日期分组,每个交易日单独处理重采样和过滤 df_output = df.groupby(df['Timestamp'].dt.date, group_keys=False).apply( lambda day_df: day_df.set_index('Timestamp') # 单天内按1分钟重采样,前向填充 .resample('1T').ffill() # 仅保留09:30-16:00的时间区间 .between_time('09:30:00', '16:00:00') ).reset_index() # 可选逻辑:如果需要保留原始数据中早于09:30的交易记录,可改用下方逻辑替换group内的处理: # df_output = df.groupby(df['Timestamp'].dt.date, group_keys=False).apply( # lambda day_df: # # 合并原始早于09:30的记录 + 09:30-16:00填充后的记录 # pd.concat([ # day_df[day_df['Timestamp'].dt.time < pd.to_datetime('09:30:00').time()].set_index('Timestamp'), # day_df.set_index('Timestamp').resample('1T').ffill().between_time('09:30:00', '16:00:00') # ]).sort_index() # ).reset_index()
方案优势
- 完全避免生成非交易日数据:仅处理原始数据中存在的日期,不会生成2021-02-08这类无交易的日期数据,符合需求。
- 执行效率极高:单天内重采样最多生成390条(09:30到16:00共390分钟)数据,不需要全局生成跨多年的全量分钟级时间戳,处理多年交易数据也不会有性能问题。
内容的提问来源于stack exchange,提问作者Chris Bauer
相关产品推荐
相关产品推荐

