如何在含缺失值的时序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
相关产品推荐
相关产品推荐

