如何用Pandas高效清理含错误值的日累计降水时间序列
高效清理日累计降水量时间序列的向量化方案
问题核心
处理存储日累计降水量的Pandas时间序列:
- 序列中存在连续值低于前值的错误,需替换为最后一个正确值
- 每日首个时间戳的累计值会重置,需按日期分组处理
示例数据
先构造含错误的测试数据:
import pandas as pd dates = pd.date_range('2024-01-01', periods=10, freq='H') precip = [0, 2, 5, 3, 6, 0, 1, 4, 2, 5] df = pd.DataFrame({'precip_cum': precip}, index=dates)
低效迭代代码(对比用)
原方案通过逐行迭代处理,数据量大时性能极差:
cleaned = [] last_valid = 0 current_date = df.index[0].date() for idx, val in df['precip_cum'].items(): if idx.date() != current_date: current_date = idx.date() last_valid = val cleaned.append(val) else: if val >= last_valid: last_valid = val cleaned.append(val) else: cleaned.append(last_valid) df['precip_cum_clean_iter'] = cleaned
向量化实现方案
利用Pandas的分组和累计最大值函数,完全避免循环,性能提升几个数量级:
# 按日期分组,计算每组内的累计最大值 df['precip_cum_clean'] = df.groupby(df.index.date)['precip_cum'].cummax()
方案解释
- 按日期分组:
df.index.date提取每个时间戳的日期部分,以此分组保证每日的累计值独立处理,自动适配每日重置的规则 - 累计最大值
cummax():对每组内的序列计算到当前位置的最大值,天然满足累计降水量非递减的要求——任何低于前值的错误值都会被替换为之前的有效最大值 - 自动适配初始值:如果每日首个时间戳的重置值不为0,该方法依然有效,因为每组的累计最大值从该组第一个元素开始计算
验证结果
对比两种方法的输出,结果完全一致:
| precip_cum | precip_cum_clean_iter | precip_cum_clean | |
|---|---|---|---|
| 2024-01-01 00:00:00 | 0 | 0 | 0 |
| 2024-01-01 01:00:00 | 2 | 2 | 2 |
| 2024-01-01 02:00:00 | 5 | 5 | 5 |
| 2024-01-01 03:00:00 | 3 | 5 | 5 |
| 2024-01-01 04:00:00 | 6 | 6 | 6 |
| 2024-01-02 00:00:00 | 0 | 0 | 0 |
| 2024-01-02 01:00:00 | 1 | 1 | 1 |
| 2024-01-02 02:00:00 | 4 | 4 | 4 |
| 2024-01-02 03:00:00 | 2 | 4 | 4 |
| 2024-01-02 04:00:00 | 5 | 5 | 5 |
内容的提问来源于stack exchange,提问作者Vincent Toupet
相关产品推荐
相关产品推荐

