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

如何使用Pandas填充异常检测数据中的指定长度间隙?

填充Pandas中指定长度的异常检测间隙

问题场景

我有一个仅包含0和1的Pandas DataFrame,0代表未检测到异常,1代表检测到异常:

import pandas as pd

input_data = pd.DataFrame(data={'my_event': [0., 0., 1., 1., 0., 1., 0., 0., 0., 1., 1.]},
                          index=pd.date_range(start='2023-01-01 00:00:00', end='2023-01-01 00:00:10', freq='s'))

需求是仅填充2秒及更短的异常间隙(间隙指异常检测时段之间的短时间未检测到异常的时段),示例预期输出为my_event列值为[0., 0., 1., 1., 1., 1., 0., 0., 0., 1., 1.]的DataFrame,核心是能自定义指定填充的间隙长度。

简便解决方案

方法:结合前向/后向填充与时间步限制

通过将0替换为NaN,利用Pandas的ffill和bfill方法的limit参数控制填充的间隙长度,步骤直观易懂:

  1. 复制原数据并将0替换为NaN,保留1作为异常标记:
df = input_data.copy()
df['my_event'] = df['my_event'].replace(0, pd.NA)
  1. 双向填充短间隙,最后还原长间隙的NaN为0:
# 定义允许填充的最大间隙时长(对应索引频率的步数,此处为秒级,所以2秒=2步)
max_gap_steps = 2

# 前向填充:从异常点往后填充,最多覆盖max_gap_steps个时间步
df_filled = df.ffill(limit=max_gap_steps)
# 后向填充:从异常点往前填充,覆盖剩余符合条件的间隙
df_filled = df_filled.bfill(limit=max_gap_steps)

# 将未被填充的NaN(即超过max_gap_steps的长间隙)还原为0
df_filled['my_event'] = df_filled['my_event'].fillna(0)

运行后得到的df_filled即为预期结果:

my_event
2023-01-01 00:00:00       0.0
2023-01-01 00:00:01       0.0
2023-01-01 00:00:02       1.0
2023-01-01 00:00:03       1.0
2023-01-01 00:00:04       1.0
2023-01-01 00:00:05       1.0
2023-01-01 00:00:06       0.0
2023-01-01 00:00:07       0.0
2023-01-01 00:00:08       0.0
2023-01-01 00:00:09       1.0
2023-01-01 00:00:10       1.0

原理说明

  • ffill(limit=max_gap_steps):基于索引的时间频率,limit参数控制填充的最大时间步数,只会填充异常点之后≤指定时长的间隙。
  • bfill(limit=max_gap_steps):反向填充异常点之前的短间隙,确保双向覆盖所有符合条件的间隙。
  • 最后还原NaN为0:保留那些超过指定时长的正常间隙(比如示例中第6-8秒的连续3个0,不会被填充)。

适配不同时间频率

如果你的DataFrame索引是其他频率(如分钟、小时),只需将max_gap_steps设置为对应时长的步数即可。例如,分钟级索引下要填充5分钟的间隙,就设置max_gap_steps=5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:42:49