如何用df.resample处理离散时间,匹配交易软件30分钟K线时段?
解决自定义时段30分钟K线合成问题
你不能用简单的按索引整除30或者固定频率resample,因为交易软件的K线时段是非标准30分钟(比如10:00-10:45、11:15-13:15这种包含休市的长时段),而且最后一根必须锁定14:45-15:00。下面是直接可行的实现方案:
步骤1:定义交易软件的目标时段
先把要求的所有时段整理成明确的时间区间:
import pandas as pd # 交易软件指定的30分钟K线时段(按顺序排列) target_sessions = [ ("09:00:00", "09:30:00"), ("09:30:00", "10:00:00"), ("10:00:00", "10:45:00"), ("10:45:00", "11:15:00"), ("11:15:00", "13:15:00"), ("13:15:00", "14:45:00"), ("14:45:00", "15:00:00") ] # 转换为带日期的datetime区间(假设你的df时间列名为'date',且为datetime类型) trade_date = df['date'].dt.date.iloc[0] session_intervals = [] for start, end in target_sessions: start_dt = pd.to_datetime(f"{trade_date} {start}") end_dt = pd.to_datetime(f"{trade_date} {end}") session_intervals.append(pd.Interval(start_dt, end_dt, closed='left'))
步骤2:给1分钟K线匹配对应时段
用pd.cut将每个分钟K线的时间戳映射到目标时段:
# 添加时段标记列 df['period'] = pd.cut(df['date'], bins=session_intervals, labels=[f"{s}-{e}" for s,e in target_sessions]) # 过滤掉不在交易时段内的无效数据(如果存在) df = df.dropna(subset=['period'])
步骤3:按时段聚合生成K线
按标记的时段分组,计算标准K线指标,同时将时段起始时间设为索引:
# 聚合计算30分钟K线数据 result = df.groupby('period').agg({ 'date': 'first', # 用时段起始时间作为K线时间戳 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum' }).set_index('date') # 验证最后一根K线是否为14:45-15:00 print(result.tail(1))
多交易日适配说明
如果你的数据包含多个交易日,需要按「日期+时段」组合分组,避免不同日期的同时段数据混在一起:
# 添加日期+时段的组合键 df['date_period'] = df['date'].dt.date.astype(str) + '_' + df['period'] # 按组合键聚合 result = df.groupby('date_period').agg({ 'date': 'first', 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum' }).set_index('date')
内容的提问来源于stack exchange,提问作者July
相关产品推荐
相关产品推荐

