You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅创建不规则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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:17:18