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

如何在Python Pandas中无需循环基于历史值生成新时间序列?

Pandas高效计算每日累计事件量(替代for循环)

我已知晓如何用Python的for循环解决该问题,但想了解Pandas中是否有更高效的实现方式。

问题描述

假设有两个带日期索引的Pandas Series——in和out,每个日期对应一个整数值。示例如下:

# in Series
date         val
2022-12-01   5
2022-12-02   8
2022-12-03   19
# out Series
date         val
2022-12-01   3
2022-12-02   7
2022-12-03   21

需要生成一个名为open的Series,记录每日处理的事件量,计算规则为:

  • 首日值:open.iloc[0] = in.iloc[0] - out.iloc[0]
  • 后续每日:open.iloc[i] = open.iloc[i-1] + in.iloc[i] - out.iloc[i]

预期结果:

# open Series
date         val
2022-12-01   2    # 5-3
2022-12-02   3    # 2+8-7
2022-12-03   1    # 3+19-21

请问能否在Pandas中实现该需求,无需使用for循环?


当然可以,Pandas的cumsum()方法就能高效实现这个需求,完全不需要for循环。

核心思路是:每日的in - out差值的累计和,正好匹配你的计算规则。具体步骤如下:

  1. 先计算每日的净差值:net = in['val'] - out['val']
  2. 对net做累计求和,得到的结果就是open Series的val列

代码示例:

import pandas as pd

# 构造示例数据
in_series = pd.Series([5, 8, 19], index=pd.date_range('2022-12-01', periods=3), name='val')
out_series = pd.Series([3, 7, 21], index=pd.date_range('2022-12-01', periods=3), name='val')

# 计算每日净差值
net = in_series - out_series

# 累计求和得到open Series
open_series = net.cumsum().rename('val').to_frame('val')

print(open_series)

运行结果与预期完全一致:

val
2022-12-01    2
2022-12-02    3
2022-12-03    1

这种方法是Pandas原生的向量化操作,比for循环效率高得多,数据量越大优势越明显。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:25:42