Pandas中不规则时间索引的前向滚动窗口实现求助
解决Pandas不规则时间索引上前向滚动窗口的单调性问题
嘿,这个问题我之前也踩过坑!核心原因其实是Pandas的rolling方法对索引的要求比你想的更严格——它默认只认单调递增的索引,哪怕你的反转索引是单调递减的,也会被判定为不符合要求,这就是为什么反向窗口能正常跑,前向窗口却报错。
给你两个靠谱的实现方案,兼顾效率和简洁性:
方案一:临时替换索引(推荐)
这个方法利用Pandas原生高效的rolling能力,只需要临时把反转后的索引换成单调递增的,处理完再恢复原索引即可:
# 1. 先保存原时间索引,避免丢失 original_index = tmp.index # 2. 反转数据,同时重置为单调递增的整数临时索引 reversed_data = tmp[::-1].reset_index(drop=True) # 3. 在临时索引上做反向滚动(对应原数据的前向窗口),这里以窗口大小3的均值为例 forward_rolling = reversed_data.rolling(window=3).mean() # 4. 恢复原时间索引,再反转回原数据的顺序 forward_rolling = forward_rolling.set_index(original_index[::-1])[::-1]
这么做的好处是完全复用了Pandas优化后的滚动计算逻辑,比手动循环快很多,特别适合大数据量的场景。
方案二:手动构造前向窗口(适合小数据量)
如果你的数据量不大,也可以用shift来手动构建前向窗口,比如要取当前行及之后2行(窗口大小3):
# 构造前向窗口的每一列,比如取当前行+后1行+后2行 forward_window = pd.concat([ tmp, tmp.shift(-1), tmp.shift(-2) ], axis=1) # 计算窗口内的统计值,比如均值 forward_rolling = forward_window.mean(axis=1)
这种方法更直观,但数据量大的时候效率会比原生rolling低不少,所以优先推荐方案一。
另外补充一下:你提到的is_monotonic校验,在Pandas新版本里已经拆分成了is_monotonic_increasing和is_monotonic_decreasing,rolling方法只认可前者,这就是反转索引过不了校验的根本原因。
内容的提问来源于stack exchange,提问作者luide
相关产品推荐
相关产品推荐

