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

Pandas:在add()操作中将Series视为阶跃函数的实现方法

嘿,这个需求我太熟了!想要把两个时间序列当成阶跃函数来相加,也就是缺失的时间点自动用前一个有效值填充,用pandas的向前填充功能就能轻松搞定,咱们一步步来:

首先先回顾下你遇到的原始问题:

当两个索引不相同的时间序列相加时,非共同索引值会被创建并赋值为NaN。

import pandas as pd
import numpy as np
from datetime import datetime
ts1 = pd.Series([1, 2], index=[datetime(2011,1,2), datetime(2011,1,3)])
ts2 = pd.Series([3, 4], index=[datetime(2011,1,3), datetime(2011,1,4)])
ts1.add(ts2)
# 输出:
# 2011-01-02    NaN
# 2011-01-03    5.0
# 2011-01-04    NaN
# dtype: float64

你的目标是让缺失的时间点用前一个最近的有效值填充,得到这样的结果:

# 期望输出:
# 2011-01-02    NaN # ts2无该日期的前置值,故仍为NaN
# 2011-01-03    5.0 #
# 2011-01-04    6.0 # ts1沿用2011-01-03的数值2
# dtype: float64

解决方案

核心思路是先把两个序列的时间索引合并,让每个序列都对齐到完整的时间轴,再用**向前填充(ffill)**补全缺失值,最后相加即可。具体代码如下:

import pandas as pd
from datetime import datetime

# 初始化原始时间序列
ts1 = pd.Series([1, 2], index=[datetime(2011,1,2), datetime(2011,1,3)])
ts2 = pd.Series([3, 4], index=[datetime(2011,1,3), datetime(2011,1,4)])

# 合并两个序列的索引,得到包含所有时间点的完整索引
combined_index = ts1.index.union(ts2.index)

# 对每个序列重新索引,并用前一个有效值填充缺失的位置
ts1_filled = ts1.reindex(combined_index).ffill()
ts2_filled = ts2.reindex(combined_index).ffill()

# 执行相加操作
result = ts1_filled.add(ts2_filled)
print(result)

运行后你会得到完全符合预期的输出:

2011-01-02    NaN
2011-01-03    5.0
2011-01-04    6.0
dtype: float64

关键步骤解释

  • ts1.index.union(ts2.index):把两个序列的时间索引合并,确保所有出现过的时间点都被纳入计算;
  • reindex(combined_index):让每个序列对齐到完整时间轴,缺失的时间点会先被赋值为NaN;
  • ffill():全称是forward fill,会自动用前一个非NaN的值填充当前的缺失位置,完美模拟阶跃函数“保持前值直到下一个更新点”的行为;
  • 最后相加就得到了每个时间点的阶跃值之和。

如果想简化代码,也可以把步骤合并成一行:

combined_index = ts1.index.union(ts2.index)
result = ts1.reindex(combined_index).ffill() + ts2.reindex(combined_index).ffill()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:21