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

如何用Pandas移除时间序列中错误前向填充的行

处理时间序列中错误前向填充的事件数据

我有1分钟粒度的时间序列数据,包含datetime、event和duration三列。部分事件会中途暂停,但最后一个事件会被前向填充到下一个事件出现前。已知每个事件应持续的分钟数(对应duration列的数值,即该事件应出现的行数),需要把那些超出应持续次数的错误填充数据点修正为NaN。

数据示例

datetime           event     duration
2020-01-01 0:00     x           3
2020-01-01 0:01     x           3  
2020-01-01 0:02     x           3  
2020-01-01 0:03     y           2
2020-01-01 0:04     y           2
2020-01-01 0:05     z           2
2020-01-01 0:06     z           2
2020-01-01 0:07     z           2
2020-01-01 0:08     x           5
...

比如示例中0:07的event本应为空白值,却被错误填充成了z,需要将其修正为NaN。duration列代表当前事件应持续的行数(分钟数)。

解决方案

核心逻辑:把连续相同的事件划分为一组,统计每组内的行序号,当序号超过duration指定的数值时,将对应行的event设为NaN。

代码实现

import pandas as pd

# 确保datetime列为时间类型(如果还不是的话)
df['datetime'] = pd.to_datetime(df['datetime'])

# 生成事件分组ID:每次event变化时,分组ID加1
df['group_id'] = (df['event'] != df['event'].shift(1)).cumsum()

# 统计每个分组内的行索引(从0开始计数)
df['row_in_group'] = df.groupby('group_id').cumcount()

# 修正event列:组内行数小于duration时保留原值,否则设为NaN
df['event'] = df.apply(lambda row: row['event'] if row['row_in_group'] < row['duration'] else pd.NA, axis=1)

# 清理临时生成的分组列
df = df.drop(['group_id', 'row_in_group'], axis=1)

处理后的数据效果

datetime           event     duration
2020-01-01 0:00     x           3
2020-01-01 0:01     x           3  
2020-01-01 0:02     x           3  
2020-01-01 0:03     y           2
2020-01-01 0:04     y           2
2020-01-01 0:05     z           2
2020-01-01 0:06     z           2
2020-01-01 0:07     <NA>        2
2020-01-01 0:08     x           5
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:33:18