Pandas处理DateTime时序数据统计系统停机时段方法咨询
系统停机时段统计实现方案
你现有代码仅能筛选出连续3条及以上相同值的记录,存在两个明显缺陷:一是无法区分0值停机段和数值恒定的正常采集段,会把连续输出2.5的正常工作时段误判为异常;二是没有做时间维度聚合,无法直接提取停机起止时间、统计总时长。
以下是可直接落地的实现方案:
核心实现逻辑
- 先标记停机状态:仅传感器读数为0.00的记录属于无有效采集的停机状态
- 连续段分组:通过相邻记录状态变化的标记累计生成分组ID,区分每一段连续的停机/正常运行片段
- 过滤有效停机段:筛选出记录数≥3的0值连续段(匹配你预设的判定规则)
- 时长计算:结合20分钟固定采样间隔,计算单段时长和总停机时长
完整代码
import pandas as pd # 预处理:确保时间索引为datetime格式 df.index = pd.to_datetime(df.index) # 可选优化:如果存在采样点缺失情况,先按20分钟间隔重采样,缺失点填充为0值纳入停机统计 # df = df.resample('20min').asfreq().fillna(0.0) # 1. 标记停机状态 df['is_down'] = (df['Water Quality Sensor'] == 0.00).astype(int) # 2. 为连续同状态段生成唯一分组ID df['segment_id'] = (df['is_down'] != df['is_down'].shift()).cumsum() # 3. 聚合统计各停机段信息 down_segments = df.groupby('segment_id').agg( start_time=('Water Quality Sensor', lambda x: x.index[0]), end_time=('Water Quality Sensor', lambda x: x.index[-1]), record_count=('Water Quality Sensor', 'count'), is_down=('is_down', 'first') ).query("is_down == 1 and record_count >= 3").reset_index(drop=True) # 4. 计算单段停机时长(补全最后一个采样点对应的20分钟窗口,匹配你举例的3个点对应1小时的统计规则) down_segments['duration'] = (down_segments['end_time'] - down_segments['start_time']) + pd.Timedelta(minutes=20) # 计算总停机时长 total_down_duration = down_segments['duration'].sum()
结果说明
针对你提供的样例数据,运行后会输出2个有效停机段:
- 第一段:开始时间2022-01-01 09:00:00,结束时间2022-01-01 10:40:00,时长2小时
- 第二段:开始时间2022-01-01 12:40:00,结束时间2022-01-01 13:20:00,时长1小时
累计总停机时长为3小时。
你举例的2:20、2:40、3:00三个连续0值场景,计算后时长刚好为1小时,完全匹配需求。
如果不需要把最后一个采样点的20分钟窗口计入时长,直接用
end_time - start_time计算时长即可,可根据实际业务规则调整。
内容的提问来源于stack exchange,提问作者Eliz Lim
相关产品推荐
相关产品推荐

