如何用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
相关产品推荐
相关产品推荐

