如何优雅创建不规则pd.DatetimeIndex?附交易时段生成示例
优雅创建不规则交易时段的pd.DatetimeIndex方法
刚好之前处理过类似的交易时间序列需求,分享一个简洁优雅的实现方式给你~
思路概述
我们需要把给定的交易日期和时段组合,生成每个时段内30分钟频率、右闭合的时间点,最后合并成统一的DatetimeIndex。核心是利用pandas的date_range工具,结合列表推导式批量处理每个时段,既简洁又易维护。
代码实现
import pandas as pd # 输入的交易日期(数字格式) trade_dates = [20180104, 20180105, 20180108, 20180109] # 转换为标准日期对象,方便后续拼接时段时间 dates = pd.to_datetime([str(d) for d in trade_dates]).date # 定义每个交易日的两个交易时段(起始、结束时间) sessions = [("09:30", "11:30"), ("13:00", "15:00")] # 用列表推导式生成所有时间点并转为DatetimeIndex result_idx = pd.DatetimeIndex([ time_point for date in dates for start_str, end_str in sessions for time_point in pd.date_range( start=pd.to_datetime(f"{date} {start_str}"), end=pd.to_datetime(f"{date} {end_str}"), freq="30min", closed="right" ) ])
关键细节解释
- 日期转换:先把输入的数字日期转成字符串,再转为pandas的日期对象,避免手动拼接字符串时出现格式错误;
closed="right"参数:这是实现“右闭合”的核心,它让date_range只保留每个30分钟区间的结束点(比如从09:30开始,第一个点就是10:00,直到11:30这个结束点),完全匹配你的预期结果;- 列表推导式:相比嵌套循环,用列表推导式让代码更紧凑,逻辑一目了然,符合“优雅”的要求。
验证结果
打印生成的索引,会得到和你预期一致的结果:
print(result_idx) # 输出示例: # DatetimeIndex(['2018-01-04 10:00:00', '2018-01-04 10:30:00', # '2018-01-04 11:00:00', '2018-01-04 11:30:00', # '2018-01-04 13:30:00', '2018-01-04 14:00:00', # '2018-01-04 14:30:00', '2018-01-04 15:00:00', # ...], # dtype='datetime64[ns]', freq=None)
内容的提问来源于stack exchange,提问作者Eastsun
相关产品推荐
相关产品推荐

