如何在Pandas中基于日期与时间列表构建全乘积DatetimeIndex?
快速构建日期与时间全组合的DatetimeIndex
问题背景
- 现有数据:
- 日期列表(长度7713):
[date(1994,5,25), ..., date(2023,12,19)] - 时间列表(每日5分钟间隔,长度288):
[time(0, 0), ..., time(23, 55)]
- 日期列表(长度7713):
- 需求:生成两者全乘积组合的
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
相关产品推荐
相关产品推荐

