使用Python/Pandas实现时间序列value列单调非递减修正
Pandas实现value列单调非递减修正方案
核心方法
你需要的效果可以直接用Pandas内置的cummax()(累积最大值)方法实现,该方法会逐行计算从首行到当前行的最大值,天然符合「当前行value小于前序值时替换为前序最大值」的要求,时间复杂度为O(n),性能最优。
完整代码示例
1. 构造测试数据
import pandas as pd # 构造与你示例一致的测试数据 data = { "datetime": [ "2021-10-05 09:39:00", "2021-10-05 09:40:00", "2021-10-05 09:41:00", "2021-10-05 09:42:00", "2021-10-05 09:43:00" ], "value": [1, 2, 3, 2, 3] } df = pd.DataFrame(data) # 转换datetime列为时间类型(可选,不影响value列计算) df["datetime"] = pd.to_datetime(df["datetime"])
2. 核心处理逻辑(仅需1行代码)
注意操作前需确保数据已经按datetime列升序排序,若数据乱序先执行排序:
# 乱序数据先排序 df = df.sort_values("datetime").reset_index(drop=True) # 修正value列为单调非递减 df["value"] = df["value"].cummax()
3. 输出验证
print(df)
输出结果与你预期一致:
datetime value 0 2021-10-05 09:39:00 1 1 2021-10-05 09:40:00 2 2 2021-10-05 09:41:00 3 3 2021-10-05 09:42:00 3 4 2021-10-05 09:43:00 3
扩展场景
如果你的数据需要按某个维度(比如设备ID、用户ID等)分组,每个分组单独修正为单调非递减,可配合groupby使用:
# 示例:按device_id分组,每组单独计算单调非递减value df["value"] = df.groupby("device_id")["value"].cummax()
内容的提问来源于stack exchange,提问作者Mischbot
相关产品推荐
相关产品推荐

