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

如何在含缺失值的时序DataFrame中标记连续15小时零值

解决连续15小时counts为0的异常标记问题(针对存在数据间隙的DataFrame)

问题核心

你之前用15小时重采样求和的方法失效,原因是数据存在缺失时,重采样会把时间间隙也算入窗口,但我们要标记的是实际存在的连续数据行中,counts为0且持续15小时及以上的时段,而非单纯时间跨度15小时。

解决方案步骤

1. 确认索引类型

先确保DataFrame的索引是datetime类型(如果未转换):

import pandas as pd

df.index = pd.to_datetime(df.index)

2. 标记0值并划分连续序列

通过计算相邻行的时间差,把时间连续(间隔1小时)且counts为0的行归为同一组:

# 标记counts为0的行
df['is_zero'] = df['counts'] == 0

# 计算相邻行的时间差(转为小时)
df['time_gap'] = df.index.to_series().diff().dt.total_seconds() / 3600

# 生成分组标签:当不是0值或时间差≠1小时时,开启新分组
df['zero_group'] = (df['is_zero'] == False) | (df['time_gap'] != 1)
df['zero_group'] = df['zero_group'].cumsum()

3. 筛选长连续0分组并标记异常

统计每个0值分组的行数,筛选出行数≥15的分组,标记对应行:

# 统计每个0值分组的行数
group_counts = df[df['is_zero']].groupby('zero_group').size()

# 获取行数≥15的分组ID
target_groups = group_counts[group_counts >= 15].index

# 标记异常行
df['is_anomaly'] = df['zero_group'].isin(target_groups) & df['is_zero']

4. 清理中间列(可选)

如果不需要中间辅助列,可删除:

df = df.drop(['is_zero', 'time_gap', 'zero_group'], axis=1)

效果说明

最终is_anomaly列中,True会标记所有属于连续15小时及以上counts为0的数据行,完全忽略数据缺失的时间间隙(因为间隙无数据,不属于连续0的范畴)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:17