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

在Pandas中高效计算日期区间数值总和(超300万行数据)

高效实现百万级时间区间数据的每日值累加

针对你300万行数据的场景,循环迭代的方式效率极低,这里提供完全向量化的高效方案,核心思路是利用「日期增量标记+累积求和」,避免生成所有区间内的日期行,处理百万级数据仅需数秒。

核心原理

把每个时间区间的数值影响转化为两个时间点的增量:

  • 在区间起始日期VALID_FROM,加上对应VALUE
  • 在区间结束日期的下一天,减去对应VALUE
    然后对所有增量按日期排序后做累积求和,就能得到每个日期的累计值总和。

代码实现

先处理示例数据验证效果,再直接应用到你的大数据集:

import pandas as pd

# 示例数据(替换为你的真实DataFrame)
df = pd.DataFrame({
    'VALID_FROM': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-03'],
    'VALID_TO': ['2022-01-02', '2022-01-03', '2022-01-04', '2022-01-06'],
    'VALUE': [5, 2, 7, 3]
})

# 确保日期列是datetime类型(大数据集建议提前处理)
df[['VALID_FROM', 'VALID_TO']] = df[['VALID_FROM', 'VALID_TO']].apply(pd.to_datetime)

# 1. 创建起始日期的增量(+VALUE)和结束日期次日的减量(-VALUE)
start_increments = df.set_index('VALID_FROM')['VALUE']
end_decrements = df.set_index(df['VALID_TO'] + pd.Timedelta(days=1))['VALUE'].mul(-1)

# 2. 合并增量并按日期排序
delta = pd.concat([start_increments, end_decrements]).sort_index()

# 3. 计算累积求和,得到每个日期的累计值
cumulative_sum = delta.cumsum()

# 4. 生成完整的日期范围,对齐累积结果并填充缺失值
full_date_range = pd.date_range(df['VALID_FROM'].min(), df['VALID_TO'].max(), freq='D')
result = cumulative_sum.reindex(full_date_range).ffill().reset_index()

# 整理列名
result.columns = ['dates', 'val']

print(result)

输出结果

dates  val
0 2022-01-01    7
1 2022-01-02   14
2 2022-01-03   12
3 2022-01-04   10
4 2022-01-05    3
5 2022-01-06    3

优势说明

  • 时间复杂度为O(n log n)(主要来自排序),远低于循环的O(n*m)(m为平均区间天数)
  • 不需要生成中间的海量日期行,内存占用仅为原数据的数倍,适合300万行的大数据场景
  • 完全基于Pandas原生向量化操作,性能远超逐行迭代

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:45:14