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

快速为DataFrame两日期列间所有日期添加行的技术问询

高效实现DataFrame日期区间行扩展的向量化方案

针对你120万行数据要扩展到3000万行的场景,之前的慢方法大多是因为用到了Python层面的逐行操作或者低效的拼接逻辑。下面给你一个纯向量化的方案,完全依托numpy和pandas的底层C实现,能把耗时控制在数分钟内:

核心思路

通过numpy的批量重复和偏移计算,避免逐行生成日期范围的开销:

  1. 先计算每个start_date到end_date的天数(包含两端)
  2. 批量重复原数据的行,次数对应每个区间的天数
  3. 用向量化的偏移量计算,给每个重复行生成对应的日期

代码实现

import pandas as pd
import numpy as np

# 确保日期列是datetime64类型(如果还不是的话)
df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])

# 1. 计算每个日期区间的天数(包含起始和结束日)
day_counts = (df['end_date'] - df['start_date']).dt.days.values + 1

# 2. 计算每个分组的起始索引(用于后续偏移计算)
group_starts = np.zeros(len(day_counts), dtype=np.int64)
group_starts[1:] = np.cumsum(day_counts[:-1])

# 3. 生成总偏移量数组:每个位置的偏移 = 当前全局索引 - 所在分组的起始索引
total_rows = group_starts[-1] + day_counts[-1]
offsets = np.arange(total_rows) - np.repeat(group_starts, day_counts)

# 4. 批量生成所有日期:重复start_date并加上偏移天数
# 把datetime转成纳秒整数进行计算,比直接操作datetime对象更快
start_dates_repeated = np.repeat(df['start_date'].values.astype(np.int64), day_counts)
expanded_dates = pd.to_datetime(start_dates_repeated + offsets * 86400 * 10**9)  # 1天的纳秒数

# 5. 构建最终的DataFrame
result = pd.DataFrame({
    'start_date': np.repeat(df['start_date'].values, day_counts),
    'end_date': np.repeat(df['end_date'].values, day_counts),
    'ID': np.repeat(df['ID'].values, day_counts),
    'Date': expanded_dates
})

为什么这个方法快?

  • 纯向量化操作:所有核心计算都是在numpy的C层面执行,没有Python循环(比如itertuples或逐行apply的开销)
  • 内存高效:直接通过数组重复和数值计算生成数据,避免了大量小DataFrame拼接的内存碎片问题
  • 避免冗余计算:一次性生成所有日期偏移,不需要为每行单独调用pd.date_range

对比你之前尝试的方法

  • df.index.repeat:你之前可能只做了行重复,没结合向量化的日期偏移,加上这一步就解决了日期生成的问题
  • pd.melt:这个工具是用来做宽表转长表,天生不适合生成连续日期范围
  • date_range + merge:逐行生成date_range会产生大量小数据集,拼接和合并的开销极大
  • itertuples:Python层面的逐行循环,120万行的循环本身就会耗时几十分钟
  • SQLite连接:数据库处理超大规模的笛卡尔积连接,内存和索引效率都跟不上,容易崩溃

注意事项

  • 确保start_date和end_date是datetime64类型,不要用object类型的字符串日期,否则数值转换会出错
  • 提前检查内存:3000万行的DataFrame(4列,其中3个日期列+1个ID列)大概需要500-800MB内存,确保你的机器有足够的空闲内存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:17:34