4. 超限事件前后瓦斯浓度趋势分段与特征提取

分段对象与判定口径

本案例处理的是单个超限测点的分钟级瓦斯浓度序列。分段前先确定三个基准量:基线浓度(超限前稳定段的滑动中位数,示例取 0.42%CH₄)、报警阈值(示例 1.00%CH₄)、恢复判定带(回落到基线 + 0.10% 以内并保持 3 分钟)。分段按时间顺序切为五段:正常段、上升段、超限段、下降段、恢复段。上升段与下降段以“是否越过阈值”为界,超限段则从首次 ≥ 阈值到末次 ≥ 阈值(含回落到阈值以下的第一个点作为下降段起点)。

分段的关键不是画线,而是让每段的边界可复算。下面给出一个不依赖第三方库的 Python 实现,输入为 [(timestamp, ch4)] 列表,输出分段表与特征量。

from statistics import median

BASELINE_WIN = 10      # 基线滑动窗口(分钟)
ALARM = 1.00           # 报警阈值 %CH4
RECOVER_BAND = 0.10    # 恢复判定带
RECOVER_HOLD = 3       # 恢复需保持的分钟数

def baseline_of(series, idx):
    lo = max(0, idx - BASELINE_WIN)
    return median(v for _, v in series[lo:idx]) if idx > lo else series[0][1]

def segment(series):
    n = len(series)
    base = baseline_of(series, 0)
    # 1) 找首次越限与末次越限
    first = next((i for i, (_, v) in enumerate(series) if v >= ALARM), None)
    if first is None:
        return {"baseline": base, "segments": [], "note": "未超限"}
    last = max(i for i, (_, v) in enumerate(series) if v >= ALARM)

    # 2) 上升段起点:从首次越限向前回溯到浓度开始单调抬升处
    rise_start = first
    while rise_start > 0 and series[rise_start - 1][1] > base + 0.02:
        rise_start -= 1

    # 3) 下降段终点:从末次越限向后找连续 RECOVER_HOLD 分钟落入恢复带
    fall_end = last
    for i in range(last, n - RECOVER_HOLD):
        window = [v for _, v in series[i:i + RECOVER_HOLD]]
        if all(v <= base + RECOVER_BAND for v in window):
            fall_end = i + RECOVER_HOLD - 1
            break
    else:
        fall_end = n - 1

    bounds = [
        ("正常段", 0, rise_start - 1),
        ("上升段", rise_start, first - 1),
        ("超限段", first, last),
        ("下降段", last + 1, fall_end - RECOVER_HOLD),
        ("恢复段", fall_end - RECOVER_HOLD + 1, n - 1),
    ]
    segs = []
    for name, a, b in bounds:
        if a > b:
            continue
        pts = series[a:b + 1]
        dur = (pts[-1][0] - pts[0][0]).total_seconds() / 60 + 1
        slope = (pts[-1][1] - pts[0][1]) / max(dur - 1, 1)
        segs.append({
            "name": name, "start": pts[0][0], "end": pts[-1][0],
            "duration_min": dur, "slope_pct_per_min": round(slope, 3),
            "peak": max(v for _, v in pts),
        })
    return {"baseline": round(base, 3), "segments": segs}

特征量提取与判读

每段输出四个特征:起止时间、持续时间(分钟)、段内斜率(%CH₄/min,用首末点差除以间隔分钟数)、段内峰值。上升段斜率反映涌出或风量变化的剧烈程度;超限段持续时间与峰值共同决定事件等级;下降段斜率反映处置(加大风量、封闭、抽采)见效速度;恢复段持续时间用于判断是否真正稳定。示例数据下,若上升段斜率约 0.12 %/min、超限段持续 14 min、峰值 1.86%,则属于“快速上升、中等持续”的典型涌出型曲线,处置重点应放在上升段起点前后的作业与通风状态。

斜率对采样间隔敏感:分钟级数据用“首末差/间隔分钟”即可;若数据存在缺测,先按时间戳重采样到 1 min 网格再分段,避免缺测点把斜率算大。
超限测点瓦斯浓度时序分段(示例数据) %CH₄ 时间/min 报警阈值 1.00% 基线 0.42% 正常段 上升段 超限段 下降段 恢复段 首次越限 峰值 1.86% 末次越限 上升段 斜率≈0.12%/min 超限段 持续 14 min 下降段 斜率≈-0.09%/min

分段结果表与复核要点

把上面的输出整理成表,便于与报警记录、断电记录交叉核对。示例数据(假设值,用于说明格式与判读方法)如下:

段名起止时间持续(min)斜率(%/min)峰值(%)
正常段08:00–08:5960+0.0010.45
上升段09:00–09:1011+0.1201.02
超限段09:11–09:2414+0.0301.86
下降段09:25–09:3915-0.0901.10
恢复段09:40–10:0930-0.0020.50

复核时重点看三处:一是上升段起点是否早于报警触发时刻,若明显提前,说明报警存在滞后;二是超限段内是否出现“回落再抬升”的双峰,若有则需拆成两个超限子段;三是恢复段是否在 30 min 内持续低于恢复带,若反复越带,应把恢复段延长或标记为“未稳定恢复”。这三项直接决定后续处置核查与断电验证的取样区间。

分段边界依赖阈值与恢复带参数,同一事件换用不同阈值会得到不同段长。复盘报告中必须写明所用阈值、基线算法与恢复保持时长,否则不同人复算结果不可比。