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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:57:11