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
相关产品推荐
相关产品推荐

