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

如何用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()

方案解释

  1. 按日期分组:df.index.date提取每个时间戳的日期部分,以此分组保证每日的累计值独立处理,自动适配每日重置的规则
  2. 累计最大值cummax():对每组内的序列计算到当前位置的最大值,天然满足累计降水量非递减的要求——任何低于前值的错误值都会被替换为之前的有效最大值
  3. 自动适配初始值:如果每日首个时间戳的重置值不为0,该方法依然有效,因为每组的累计最大值从该组第一个元素开始计算

验证结果

对比两种方法的输出,结果完全一致:

precip_cumprecip_cum_clean_iterprecip_cum_clean
2024-01-01 00:00:00000
2024-01-01 01:00:00222
2024-01-01 02:00:00555
2024-01-01 03:00:00355
2024-01-01 04:00:00666
2024-01-02 00:00:00000
2024-01-02 01:00:00111
2024-01-02 02:00:00444
2024-01-02 03:00:00244
2024-01-02 04:00:00555

内容的提问来源于stack exchange,提问作者Vincent Toupet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:31:14