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 网格再分段,避免缺测点把斜率算大。
分段结果表与复核要点
把上面的输出整理成表,便于与报警记录、断电记录交叉核对。示例数据(假设值,用于说明格式与判读方法)如下:
| 段名 | 起止时间 | 持续(min) | 斜率(%/min) | 峰值(%) |
|---|---|---|---|---|
| 正常段 | 08:00–08:59 | 60 | +0.001 | 0.45 |
| 上升段 | 09:00–09:10 | 11 | +0.120 | 1.02 |
| 超限段 | 09:11–09:24 | 14 | +0.030 | 1.86 |
| 下降段 | 09:25–09:39 | 15 | -0.090 | 1.10 |
| 恢复段 | 09:40–10:09 | 30 | -0.002 | 0.50 |
复核时重点看三处:一是上升段起点是否早于报警触发时刻,若明显提前,说明报警存在滞后;二是超限段内是否出现“回落再抬升”的双峰,若有则需拆成两个超限子段;三是恢复段是否在 30 min 内持续低于恢复带,若反复越带,应把恢复段延长或标记为“未稳定恢复”。这三项直接决定后续处置核查与断电验证的取样区间。
分段边界依赖阈值与恢复带参数,同一事件换用不同阈值会得到不同段长。复盘报告中必须写明所用阈值、基线算法与恢复保持时长,否则不同人复算结果不可比。