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

如何在Pandas中基于日期与时间列表构建全乘积DatetimeIndex?

快速构建日期与时间全组合的DatetimeIndex

问题背景

  • 现有数据:
    • 日期列表(长度7713):[date(1994,5,25), ..., date(2023,12,19)]
    • 时间列表(每日5分钟间隔,长度288):[time(0, 0), ..., time(23, 55)]
  • 需求:生成两者全乘积组合的DatetimeIndex,最终长度为 7713 * 288
  • 当前方案性能瓶颈:
    原代码通过嵌套列表推导式生成时间戳再构建索引,耗时约18秒(组合9秒+索引构建9秒);直接传入DataFrame作为索引耗时6秒,但仍有大幅优化空间。
# 原方案代码
datetimes = [pd.Timestamp.combine(d, t) for d in dates for t in times]
index = pd.DatetimeIndex(datetimes)

优化方案

方案一:Numpy向量化广播(最快实现)

利用Numpy的向量化操作替代Python循环,大幅提升效率:

import pandas as pd
import numpy as np

# 将日期列表转为numpy datetime64数组(按天精度)
dates_np = np.array(dates, dtype="datetime64[D]")
# 将时间转为分钟级timedelta64数组
times_np = np.array([t.hour * 60 + t.minute for t in times], dtype="timedelta64[m]")

# 广播相加生成所有组合,再扁平化转为DatetimeIndex
combined = dates_np[:, None] + times_np
index = pd.DatetimeIndex(combined.flatten())

性能优势:Numpy的底层C实现避免了Python循环的开销,整个过程耗时通常在1秒以内,比原方案快一个数量级。

方案二:MultiIndex转换(代码更简洁)

通过构建多级索引再合并为DatetimeIndex,效率优于原方案:

import pandas as pd

# 生成日期与时间的笛卡尔积多级索引
mi = pd.MultiIndex.from_product([dates, times])
# 将多级索引的日期和时间拼接后转为DatetimeIndex
index = pd.to_datetime(
    mi.get_level_values(0).astype(str) + " " + mi.get_level_values(1).astype(str)
)

性能优势:避免了手动嵌套循环,耗时约2-3秒,比原方案提升明显。

方案选择建议

  • 追求极致速度优先选Numpy向量化广播方案;
  • 追求代码简洁易读可选MultiIndex转换方案。

内容的提问来源于stack exchange,提问作者Jackson Tale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:09