Просмотр исходного кода

温度:高频候选二次确认、归一化辅助子图并生成温度手册

18922397810 2 недель назад
Родитель
Сommit
b946790376

+ 1 - 0
.gitignore

@@ -27,5 +27,6 @@ models/datas/vibration/
 models/datas/artifacts/
 # 生成的分析图表与演示构建临时文件
 总结文档/figures/
+总结文档/figures_temperature/
 .chart-data-*/
 .ppt-build/

+ 26 - 24
_tmp_temperature/README.md

@@ -9,7 +9,7 @@
 
 1. **同级温差**(常开特征):两两温差、级差、每缸相对同级中位、每缸历史同级偏移;
 2. **短时单缸上升/下降**:1h/3h/6h 同级相对变化,1h 观察、2h 事件;
-3. **7#/8#/9# 三级单缸**:跨级残差 `t3 ≈ a·med1 + b·med2 + c`,只做长持续、低置信度事件;
+3. **7#/8#/9# 三级高频波动**:只用小时标准差相对基线,单独成表,不混入温度事件;
 4. **温度通道异常**:停机/突然到环境温度、通道骤降、冻值、坏道,独立成表,不混入温度故障。
 
 压力、振动不参与本目录的计算。
@@ -47,48 +47,48 @@ python3 _tmp_temperature/make_report.py
 | 文件 | 内容 |
 |---|---|
 | `温度小时特征.csv` | 每小时 × 级:全部特征 + 等级/方向/类型/置信度/依据 |
-| `温度异常段.csv` | 事件段(只含轻微/异常/严重) |
+| `温度异常段.csv` | **唯一故障段表**:温度事件 + 已确认高频波动,一行一段;当前 96 行 |
 | `温度观察段.csv` | 1h 观察,逐小时一行,关联后续事件 |
-| `温度过渡段.csv` | 启停/运行中过渡段(单独观察,不混入确认事件) |
-| `温度高频波动段.csv` | 7/8/9 三级高频波动(单独表,不混入确认事件) |
+| `温度过渡段.csv` | 启停/运行中过渡段(只保留 CSV,不进入页面和故障表) |
+| `温度高频波动段.csv` | `温度异常段.csv` 中已确认的高频波动(47 行) |
+| `温度高频候选.csv` | 高频首轮候选 60 行,含去趋势残差、反复升降次数和是否确认 |
 | `温度演化周期.csv` | 每次开机周期 × 级 的演化汇总(“一份数据”) |
 | `温度通道异常段.csv` | 停机/通道异常、骤降、冻值、坏道 |
 | `温度通道质控.csv` | 死道/冻值/越界统计 |
 | `同级温差特征.csv` | 常开同级温差(无事件也输出) |
 | `温度短时特征.csv` | 1h/3h/6h 同级相对变化 |
-| `温度三级特征.csv` | 三级温度、一级/二级中位、残差、残差3h |
 | `pks_temperature_hourly.csv` | 小时长表(点位级) |
 | `回测_温度事件.csv` | 维修事件回测(含通道异常命中/同日命中) |
 | `分析报告.md` | 结果与阈值说明 |
 
-## 温度事件 / 过渡段观察页
+## 温度事件 / 高频波动观察页
 
 ```bash
-# 1) 生成过渡段标签(9 条:启停/运行中)
+# 过渡段 CSV 单独生成;页面不再加载过渡段
 python3 _tmp_temperature/make_transition_labels.py
 
-# 2) 后端(8000)
+# 后端(8000)
 cd backend && python3 -m uvicorn app.main:app --host 127.0.0.1 --port 8000
 
-# 3) 前端(已有 5173 则直接用)
+# 前端(已有 5173 则直接用)
 cd frontend && npm run dev
 
 # 打开
 # http://127.0.0.1:5173/temperature.html
 ```
 
-页面合并两类标签:
-- `温度异常段.csv`:67 条温度事件;
-- `温度过渡段.csv`:9 条启停/运行中过渡段;
-- `温度高频波动段.csv`:61 条 7/8/9 三级高频波动。
-
-共 137 条,可按类型(温度事件 / 过渡段 / 高频波动)、机组、级、阶段、维修命中、温度事件命中筛选。
+页面只读 `温度异常段.csv`:
+- 温度事件 49 条(含 1 条单缸 6h 相对抬升);
+- 高频波动 47 条(同一张表中的 `特征类型=高频波动` 行);
+- 共 96 条,按类型(温度事件 / 高频波动)、机组、级、阶段、维修命中、温度事件命中筛选。
 
+- 过渡段只保留 `温度过渡段.csv`,不进入页面和确认事件。
 - 标签接口:`/api/temperature-transition/labels`
-- 波形接口:`/api/temperature-transition/series?key=transition:0`(5 秒粒度、前后各 6h)
+- 波形接口:`/api/temperature-transition/series?key=event:0`(5 秒粒度、前后各 6h)
 - 列表标注:`维修命中/未命中`(`compressor_fault`,前 7 天~后 1 天)、`温度事件命中/未命中`(`温度异常段.csv`)、`观察命中/未命中`(`温度观察段.csv`)
-- `维修命中` 目前 15/71;9 条过渡段全部维修未命中。
-- 图上方固定显示:`关联通道异常`、`阶段触发依据`(不占列表)。
+- `维修命中` 目前 25/96。
+- 字段和取值域见 `_tmp_temperature/温度异常段_字段说明.md`。
+- 图上方固定显示:`维修命中`(命中时)、`阶段触发依据`(不占列表);`关联通道异常`不再显示。
 - 图内画出:各级缸温、级差/同级偏高/同级偏低、运行状态、累计运行小时/转速、机身振动、排压、调节阀等。
 - 高频波动标签额外显示小时标准差、基线标准差、波动倍数和 z。
 
@@ -96,13 +96,15 @@ cd frontend && npm run dev
 
 - **运行态**:7/8/9 用 `YSJ_41>0`;4# 用**累计运行小时** `YSJ_31`(+1/h=运行、0=停机,机身振动/进气压力兜底);5#/6# 用 **2/4 信号**(一级排气压力、一级进气压力、机身振动、调节阀开度)。
 - **有效小时**:覆盖率 ≥80%;整级最高温度 <45℃ 视为停机;单通道突然到环境温度并恢复 → `停机/通道异常`,不参与故障。
-- **常开特征**:级差、级差较平时变化、同级偏高/偏低、自身历史偏移、1h/3h/6h 相对变化。
-- **触发**:一级/二级只用同级相对量;三级用跨级残差。
-- **确认**:持续型 3h;短时型 1h 观察、2h 事件;三级长持续 ≥6h;相邻段间隔 ≤6h 合并;启停过渡 2h 剔除。
+- **小时聚合**:温度均值/最小值/最大值/标准差均排除 0 值;另存原始最小值、零值样本数用于通道掉点判定。
+- **常开特征**:级差、级差较平时变化、同级偏高/偏低、自身历史偏移、1h/3h/6h 相对变化、6h 整级/单缸抬升。
+- **触发**:一级/二级用同级相对量;三级高频先去慢趋势,要求去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h,首轮候选写入 `温度高频候选.csv`,确认后才进入事件;6h 单缸相对抬升(单缸 3/4.5/6℃、整级 6h 抬升在 ±3℃ 内、持续 ≥2h)并入事件;已有持续偏高事件保持原类型;整级共同抬升只作特征。
+- **通道掉点**:原始最小值 ≤45℃ 或零值样本数 ≥5 时标记;部分掉点用原始最小值 vs 近期基准(≥20℃)标记;掉点恢复段不参与短时变化。
+- **确认**:持续型 3h;短时型 1h 观察、2h 事件;相邻段间隔 ≤6h 合并;启停过渡 2h 剔除。
 - **方向**:偏高 / 偏低 / 混合;`观察` 不报警,只做提示。
 - **统一阈值**:
-  - 同级偏高/偏低:轻微 4/5℃、异常 6/8℃、严重 10/12℃
-  - 级差变化:轻微 4℃、异常 8℃、严重 15℃
+  - 同级偏高/偏低:轻微 4/5℃、异常 6/8℃、严重异常 10/12℃
+  - 级差变化:轻微 4℃、异常 8℃、严重异常 15℃
   - 短时同级相对:1h 3/4/6/9℃、3h 4/5/7/11℃、6h 6/7/9/13℃
-  - 三级残差:轻微 9.5℃、异常 15℃、严重 20℃(均需 ≥3h)
+  - 高频确认:去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h
 - **通道异常**:突然到环境温度/归零并恢复 → 停机/通道异常;短时骤降 >15℃ 并恢复 → 通道骤降;连续 ≥12h 不变且同级变化 ≥3℃ → 冻值;零值/越界/长期低温 → 坏道。

+ 1 - 0
_tmp_temperature/backtest.py

@@ -65,6 +65,7 @@ def main() -> None:
         features[column] = pd.to_numeric(features[column], errors="coerce")
 
     segments = pd.read_csv(directory / "温度异常段.csv")
+    segments = segments[segments["特征类型"] != "高频波动"].copy()
     segments["start"] = pd.to_datetime(segments["开始小时"])
     segments["end"] = pd.to_datetime(segments["结束小时"])
     segments["unit"] = segments["机组"].str.replace("号机", "号机组", regex=False)

+ 7 - 4
_tmp_temperature/config.py

@@ -171,16 +171,19 @@ DEFAULT_THRESHOLDS: dict[str, float] = {
     "observe_rate1": 3.0, "mild_rate1": 4.0, "abnormal_rate1": 6.0, "severe_rate1": 9.0,
     "observe_rate3": 4.0, "mild_rate3": 5.0, "abnormal_rate3": 7.0, "severe_rate3": 11.0,
     "observe_rate6": 6.0, "mild_rate6": 7.0, "abnormal_rate6": 9.0, "severe_rate6": 13.0,
-    # 7#/8#/9# 三级 cross-stage residual (degC).
-    "mild_resid3": 9.5, "abnormal_resid3": 15.0, "severe_resid3": 20.0,
-    "resid3_persist_hours": 3,
     # Intra-hour high-frequency fluctuation: std relative to its normal baseline.
     "hf_ratio_mild": 2.5, "hf_ratio_abnormal": 3.5, "hf_ratio_severe": 5.0,
     "hf_z_mild": 6.0, "hf_z_abnormal": 9.0, "hf_z_severe": 12.0,
     "hf_min_std": 0.8, "hf_base_floor": 0.3,
     "hf_persist_hours": 3,
+    # 12h relative rise (single-cylinder and stage-level), integrated into events.
+    "rise_single_mild": 3.0, "rise_single_abnormal": 4.5, "rise_single_severe": 6.0,
+    "rise_stage_mild": 3.0, "rise_stage_abnormal": 5.0, "rise_stage_severe": 7.0,
+    "rise_stage_flat_limit": 3.0,
+    "rise_persist_hours": 2, "rise_baseline_hours": 6, "rise_min_history_hours": 4,
     # Channel / shutdown.
-    "channel_ambient": 45.0, "channel_drop_delta": 15.0,
+    "channel_ambient": 45.0, "channel_drop_delta": 8.0,
+    "channel_min_drop": 20.0, "channel_zero_min": 5,
     "channel_recover_hours": 3, "channel_frozen_hours": 12,
     "channel_frozen_eps": 0.1, "channel_peer_variation": 3.0,
     # Persistence.

+ 6 - 4
_tmp_temperature/data.py

@@ -40,10 +40,12 @@ def _hourly_sql(config: UnitConfig) -> tuple[str, list]:
         high_high = limits.get("high_high")
         high = 1e9 if high is None else float(high)
         high_high = 1e9 if high_high is None else float(high_high)
-        select.append(f"AVG(CASE WHEN {run} THEN `{column}` END) AS `{column}__avg`")
-        select.append(f"MIN(CASE WHEN {run} THEN `{column}` END) AS `{column}__min`")
-        select.append(f"MAX(CASE WHEN {run} THEN `{column}` END) AS `{column}__max`")
-        select.append(f"STDDEV(CASE WHEN {run} THEN `{column}` END) AS `{column}__std`")
+        select.append(f"AVG(CASE WHEN {run} AND `{column}` > 0 THEN `{column}` END) AS `{column}__avg`")
+        select.append(f"MIN(CASE WHEN {run} AND `{column}` > 0 THEN `{column}` END) AS `{column}__min`")
+        select.append(f"MAX(CASE WHEN {run} AND `{column}` > 0 THEN `{column}` END) AS `{column}__max`")
+        select.append(f"STDDEV(CASE WHEN {run} AND `{column}` > 0 THEN `{column}` END) AS `{column}__std`")
+        select.append(f"MIN(CASE WHEN {run} THEN `{column}` END) AS `{column}__minraw`")
+        select.append(f"SUM(CASE WHEN {run} AND `{column}` = 0 THEN 1 ELSE 0 END) AS `{column}__zeros`")
         select.append(f"SUM(CASE WHEN ({run}) AND `{column}` >= %s THEN 1 ELSE 0 END) AS `{column}__high`")
         select.append(f"SUM(CASE WHEN ({run}) AND `{column}` >= %s THEN 1 ELSE 0 END) AS `{column}__high_high`")
         params.extend([high, high_high])

+ 109 - 0
_tmp_temperature/hf_validation.py

@@ -0,0 +1,109 @@
+"""Validate high-frequency candidates with 5-second raw data.
+
+The hourly ``STDDEV`` used by the first pass also reacts to a slow one-sided
+ramp inside an hour.  This module removes a rolling slow trend and counts
+short reversals, then keeps only candidates that look like repeated up/down
+movement rather than a load ramp.
+"""
+from __future__ import annotations
+
+import re
+from datetime import datetime, timedelta
+
+import numpy as np
+import pandas as pd
+from scipy.signal import find_peaks
+
+from models.common.db import connect
+
+DEFAULT_POINT = "YSJ_21"
+TREND_WINDOW = 121          # 10-minute rolling median at 5s resolution
+MIN_PROMINENCE = 0.3        # degC; prevent sensor noise from counting
+MIN_REVERSALS_PER_HOUR = 5.0
+MIN_RESIDUAL_STD = 0.5      # degC
+
+
+def _parse(value: str) -> datetime:
+    return datetime.strptime(str(value).strip(), "%Y-%m-%d %H:%M:%S")
+
+
+def _point(row: dict) -> str:
+    point = str(row.get("阶段点位") or DEFAULT_POINT).strip()
+    return point if re.fullmatch(r"YSJ_\d+", point) else DEFAULT_POINT
+
+
+def _metrics(row: dict) -> dict:
+    batch = int(row["批次"])
+    start = _parse(row["开始小时"])
+    end = _parse(row["结束小时"]) + timedelta(hours=1)
+    point = _point(row)
+    query_start = start - timedelta(hours=1)
+    query_end = end + timedelta(hours=1)
+    with connect() as connection:
+        with connection.cursor() as cursor:
+            cursor.execute(
+                f"SELECT sample_time, `{point}` AS value "
+                "FROM pks_long_sample "
+                "WHERE import_batch_id = %s AND sample_time >= %s AND sample_time <= %s "
+                "ORDER BY sample_time",
+                (batch, query_start, query_end),
+            )
+            rows = cursor.fetchall()
+    if not rows:
+        return {"去趋势残差标准差": "", "每小时反复升降次数": "", "是否确认": "否"}
+
+    times = pd.to_datetime([item["sample_time"] for item in rows])
+    values = np.asarray([float(item["value"] or 0.0) for item in rows], dtype=float)
+    values[values <= 0] = np.nan
+    valid = ~np.isnan(values)
+    times = times[valid]
+    values = values[valid]
+    if len(values) < 30:
+        return {"去趋势残差标准差": "", "每小时反复升降次数": "", "是否确认": "否"}
+
+    series = pd.Series(values)
+    trend = series.rolling(TREND_WINDOW, center=True, min_periods=30).median().to_numpy()
+    residual = values - trend
+    window = (times >= start) & (times < end)
+    residual = residual[window]
+    segment_times = times[window]
+    if len(residual) < 30:
+        return {"去趋势残差标准差": "", "每小时反复升降次数": "", "是否确认": "否"}
+
+    residual_std = float(np.nanstd(residual))
+    prominence = max(MIN_PROMINENCE, residual_std * 0.7)
+    peaks, _ = find_peaks(residual, prominence=prominence, distance=12)
+    troughs, _ = find_peaks(-residual, prominence=prominence, distance=12)
+    hours = max((segment_times[-1] - segment_times[0]).total_seconds() / 3600.0, 1e-9)
+    reversals = float(len(peaks) + len(troughs)) / hours
+    confirmed = residual_std >= MIN_RESIDUAL_STD and reversals >= MIN_REVERSALS_PER_HOUR
+    row["阶段触发依据"] = (
+        f"{row.get('阶段触发依据') or ''};去趋势残差{residual_std:.2f}℃、"
+        f"反复升降{reversals:.1f}次/小时"
+    ).strip(";")
+    return {
+        "去趋势残差标准差": round(residual_std, 2),
+        "每小时反复升降次数": round(reversals, 1),
+        "是否确认": "是" if confirmed else "否",
+    }
+
+
+def annotate(hf_rows: list[dict]) -> list[dict]:
+    for row in hf_rows:
+        row.update(_metrics(row))
+    return hf_rows
+
+
+def filter_hf(hf_rows: list[dict]) -> tuple[list[dict], list[dict]]:
+    """Return ``(confirmed, candidates_with_metrics)``.
+
+    ``candidates_with_metrics`` keeps every first-pass candidate and its
+    validation metrics; ``confirmed`` only keeps candidates passing the
+    residual/reversal test.
+    """
+    candidates = annotate(hf_rows)
+    confirmed = [row for row in candidates if row.get("是否确认") == "是"]
+    return confirmed, candidates
+
+
+__all__ = ["annotate", "filter_hf", "MIN_RESIDUAL_STD", "MIN_REVERSALS_PER_HOUR"]

+ 23 - 29
_tmp_temperature/make_report.py

@@ -28,8 +28,10 @@ def main() -> None:
     cycles = pd.read_csv(directory / "温度演化周期.csv")
     hf_path = directory / "温度高频波动段.csv"
     hf = pd.read_csv(hf_path) if hf_path.exists() else pd.DataFrame()
+    candidate_path = directory / "温度高频候选.csv"
+    candidates = pd.read_csv(candidate_path) if candidate_path.exists() else pd.DataFrame()
 
-    events = segments[segments["是否事件"] == "是"]
+    events = segments[segments["特征类型"] != "高频波动"]
     observation_path = directory / "温度观察段.csv"
     observed = pd.read_csv(observation_path) if observation_path.exists() else pd.DataFrame()
     linked = int((observed["是否升级为事件"] == "是").sum()) if "是否升级为事件" in observed else 0
@@ -39,7 +41,7 @@ def main() -> None:
     counts["合计"] = counts.sum(axis=1)
     counts = counts.reset_index()
 
-    severe = events[events["温度阶段"].isin(["异常", "严重"])].copy()
+    severe = events[events["温度阶段"].isin(["异常", "严重异常"])].copy()
     severe = severe.sort_values(["机组", "开始小时"])
     severe_columns = ["机组", "级", "温度阶段", "特征类型", "方向", "置信度", "开始小时", "结束小时",
                       "有效运行小时数", "最大级差变化", "最大同级偏离", "最大同级偏低", "最大同级相对3h", "阶段触发依据"]
@@ -52,11 +54,9 @@ def main() -> None:
     channel_columns = ["机组", "点位描述", "异常类型", "开始小时", "结束小时", "持续自然小时数",
                        "最小值", "最大值", "同级基准中位"]
 
-    tertiary = events[events["级"] == "三级"]
     hf_counts = hf.groupby(["机组", "级", "温度阶段"]).size().reset_index(name="段数") if not hf.empty else pd.DataFrame(columns=["机组", "级", "温度阶段", "段数"])
     hf_example = hf[(hf["机组"] == "9号机") & (hf["开始小时"].str.startswith("2026-04-04"))].head(1) if not hf.empty else pd.DataFrame()
     hf_example_columns = ["机组", "级", "温度阶段", "开始小时", "结束小时", "有效运行小时数", "高频波动倍数", "高频标准差", "高频基线标准差"]
-    tertiary_counts = tertiary.groupby(["机组", "温度阶段"]).size().reset_index(name="段数") if not tertiary.empty else pd.DataFrame(columns=["机组", "温度阶段", "段数"])
 
     backtest_columns = ["机组", "故障日期", "描述", "最大同级偏离℃", "最大级差变化℃", "命中",
                         "首个事件开始", "提前小时", "同日命中", "通道异常命中", "通道异常类型"]
@@ -69,9 +69,10 @@ def main() -> None:
 
 ## 1. 结果概览
 
-- 总事件段:**{len(events)}** 段;另有 1 小时观察段 **{len(observed)}** 条(单独在 `温度观察段.csv`,其中 **{linked}** 条在 24h 内升级为事件)。
-- 三级高频波动:**{len(hf)}** 段(单独在 `温度高频波动段.csv`,不计入上面的 {len(events)} 段)。
-- 涵盖 4#~9#,统一阈值(4#~9# 一级/二级一套;三级单独跨级规则)。
+- 总故障段表 `温度异常段.csv`:**{len(segments)}** 行(温度事件 {len(events)} + 高频波动 {len(hf)})。
+- 温度事件:**{len(events)}** 段;另有 1 小时观察段 **{len(observed)}** 条(单独在 `温度观察段.csv`,其中 **{linked}** 条在 24h 内升级为事件)。
+- 三级高频波动:**{len(hf)}** 段(高频候选 **{len(candidates)}** 段,未确认的留在 `温度高频候选.csv`,不再重复计数)。
+- 涵盖 4#~9#,统一阈值(一级/二级用同级相对;三级只用高频波动单独输出)。
 - 事件类型:{', '.join(f'{key}={value}' for key, value in events['特征类型'].value_counts().items())}。
 
 {md_table(counts, list(counts.columns))}
@@ -81,9 +82,8 @@ def main() -> None:
 1. **数据有效性**:7/8/9 用转速;4# 用累计运行小时(+机身振动/进气压力兜底);5#/6# 用 2/4 信号(一级排气压力、一级进气压力、机身振动、调节阀开度);整级低于 45℃ 视为停机;单通道突然到环境温度并恢复视为“停机/通道异常”,不参与温度故障。
 2. **同级温差(常开特征)**:级差、级差较平时变化、每缸相对同级中位、每缸相对自身历史偏移;无事件小时也输出到 `同级温差特征.csv`。
 3. **短时单缸变化**:1h/3h/6h 同级相对变化;1h 记“观察”(单独输出、逐小时一行),2h 记“事件”;要求同方向连续 2 小时,并过滤“先降后升/先升后降”的过渡。
-4. **三级单缸**:`t3 ≈ a·med1 + b·med2 + c` 的跨级残差,长持续(≥6h)才出低置信度事件。
-5. **确认/滞回**:持续型 3h 确认;短时型 2h;观察 1h;相邻段间隔 ≤6h 合并。
-6. **阈值(统一)**:同级偏高/偏低 4/5、6/8、10/12℃;级差变化 4/8/15℃;短时 1h 3/4/6/9℃、3h 4/5/7/11℃、6h 6/7/9/13℃;三级残差 9.5/15/20℃(≥3h);三级高频波动:小时标准差倍数 2.5/3.5/5、标准差 ≥0.8、持续 ≥3h(单独表)。
+4. **确认/滞回**:持续型 3h 确认;短时型 2h;观察 1h;相邻段间隔 ≤6h 合并。
+5. **阈值(统一)**:同级偏高/偏低 4/5、6/8、10/12℃;级差变化 4/8/15℃;短时 1h 3/4/6/9℃、3h 4/5/7/11℃、6h 6/7/9/13℃;三级高频波动:先去慢趋势,再要求去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h(候选/确认分开);6h 单缸相对抬升 3/4.5/6℃、整级 6h 抬升在 ±3℃ 内、持续 ≥2h(已有持续偏高事件保持原类型;整级共同抬升只作特征,不作为事件)。
 
 ## 3. 维修事件回测(4#/5#/6#)
 
@@ -93,7 +93,7 @@ def main() -> None:
 - 6# 2026-02-18 通过 **2/17 22:00 的通道骤降/停机异常**命中(2h 前),不再算未命中。
 - “提前小时”负数表示在故障日当天 0 点之后的同一日内命中;`同日命中=是` 更直观。
 
-## 4. 异常/严重事件清单(供复核)
+## 4. 异常/严重异常事件清单(供复核)
 
 {md_table(severe, severe_columns)}
 
@@ -107,17 +107,10 @@ def main() -> None:
 
 {md_table(channel_examples, channel_columns)}
 
-## 6. 7#/8#/9# 三级低置信度事件
+## 6. 7#/8#/9# 三级高频波动
 
-{md_table(tertiary_counts, list(tertiary_counts.columns))}
-
-- 三级只做“跨级相对 + 长持续(≥3h)”,不参与 1h/2h 短时触发,置信度统一标“低”;高频波动见第 7 节。
-- 9# 2026-01-18 三级活塞杆断裂事件前没有有效运行数据,无法回测;8# 2025-12-06 事件前数据稀疏。
-
-## 7. 7#/8#/9# 三级高频波动
-
-- 高频波动单独输出到 `温度高频波动段.csv`,不计入上面的 {len(events)} 条确认事件。
-- 判定:小时标准差 / 近 168 个有效小时正常中位数;倍数 2.5/3.5/5,标准差 ≥0.8,持续 ≥3h。
+- 高频波动是 `温度异常段.csv` 中的 `特征类型=高频波动` 行,`温度高频波动段.csv` 为确认后的过滤副本;`温度高频候选.csv` 保留全部首轮候选及是否确认。温度事件仍为上面的 {len(events)} 条。
+- 判定:先去慢趋势,再要求去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h;首轮候选 60 段,确认 {len(hf)} 段。
 - 目前只对单缸的三级输出;一级/二级暂不输出。
 
 {md_table(hf_counts, list(hf_counts.columns))}
@@ -126,28 +119,29 @@ def main() -> None:
 
 {md_table(hf_example, hf_example_columns)}
 
-## 8. 演化周期
+## 7. 演化周期
 
 `温度演化周期.csv` 按 **每次开机周期 × 级** 一行,包含:
 
 - 阶段演化顺序、方向、特征类型、置信度;
-- 观察/轻微/异常/严重各阶段起止与运行小时数;
+- 观察/轻微/异常/严重异常各阶段起止与运行小时数;
 - 峰值时刻/峰值缸、最大级差变化、最大同级偏高/偏低;
 - 首次短时触发、首次持续触发、关联通道异常。
 
-## 9. 运行态加强后的变化
+## 8. 运行态加强后的变化
 
 - 4# 改用**累计运行小时** `YSJ_31`(+1/h 运行、0 停机);5#/6# 改用 **2/4 信号**(一级排气压力、一级进气压力、机身振动、调节阀开度)。
 - 与旧版“一级进气 >0.15”相比,剔除了大量“油泵在转但压缩机已停/卸载”的小时:4# 约 117h、5# 约 101h、6# 约 669h。
-- 因此有 **9 个旧事件落在启停过渡段**,新版不再作为确认事件:4# 2026-02-15、2026-03-24、2026-04-04、2026-04-25、2026-04-26、2026-05-30;5# 2025-05-09;7# 2025-02-17;8# 2025-01-18。它们多数是开机/停机温度爬坡,不是稳定运行故障;如需要,可单独输出“过渡段”供复核。
+- 温度小时均值已排除 0 值;通道掉点用原始最小值和零值样本数标记,恢复段不再被当成上升;短时变化要求当前值高于近期 6h 中位。
+- 单缸 6h 相对抬升并入事件(类型 `单缸抬升`):阈值 3/4.5/6℃,且整级 6h 抬升在 ±3℃ 内;已有 `持续偏高` 事件保持原类型,不重新分类。整级共同抬升只保留为特征,不生成事件。
+- 因此有 **9 个旧事件落在启停过渡段**,新版不再作为确认事件:4# 2026-02-15、2026-03-24、2026-04-04、2026-04-25、2026-04-26、2026-05-30;5# 2025-05-09;7# 2025-02-17;8# 2025-01-18。它们多数是开机/停机温度爬坡,不是稳定运行故障;这些过渡段只保留在 `温度过渡段.csv`,不在页面和确认事件中展示。
 
-## 10. 限制与下一步
+## 9. 限制与下一步
 
 1. 4/5/6 无转速,运行态已用累计运行小时/2-of-4 信号加强;极低负荷小时仍可能有少量误判。
 2. 通道异常表较大(单点级,包含大量 1–2h 采样跌落);建议先按“持续≥2h 或 坏道/冻值”筛选复核。
-3. 三级残差 R² 只有 0.38~0.61,三级事件只作低置信度提示,不直接报警。
-4. 现有 level 阈值已由你复核为真事件,暂不提高;短时/偏低/三级事件建议再做一轮现场复核后微调。
-5. 规则稳定后再合并进 `models/temperature/`,并接入 `compressor_alarm`。
+3. 现有 level 阈值已由你复核为真事件,暂不提高;短时/偏低事件建议再做一轮现场复核后微调。
+4. 规则稳定后再合并进 `models/temperature/`,并接入 `compressor_alarm`。
 """
     (directory / "分析报告.md").write_text(text, encoding="utf-8")
     print(f"written -> {directory / '分析报告.md'}")

+ 63 - 80
_tmp_temperature/out/分析报告.md

@@ -6,130 +6,112 @@
 
 ## 1. 结果概览
 
-- 总事件段:**67** 段;另有 1 小时观察段 **403** 条(单独在 `温度观察段.csv`,其中 **30** 条在 24h 内升级为事件)。
-- 三级高频波动:**61** 段(单独在 `温度高频波动段.csv`,不计入上面的 67 段)。
-- 涵盖 4#~9#,统一阈值(4#~9# 一级/二级一套;三级单独跨级规则)。
-- 事件类型:持续偏高=34, 混合=10, 持续偏低=9, 三级相对偏低=8, 三级相对偏高=4, 短时突升=2。
-
-| 机组 | 三级相对偏低 | 三级相对偏高 | 持续偏低 | 持续偏高 | 混合 | 短时突升 | 合计 |
-|---|---|---|---|---|---|---|---|
-| 4号机 | 0 | 0 | 5 | 8 | 2 | 0 | 15 |
-| 5号机 | 0 | 0 | 2 | 13 | 2 | 0 | 17 |
-| 6号机 | 0 | 0 | 2 | 10 | 3 | 0 | 15 |
-| 7号机 | 1 | 0 | 0 | 3 | 2 | 0 | 6 |
-| 8号机 | 0 | 0 | 0 | 0 | 1 | 1 | 2 |
-| 9号机 | 7 | 4 | 0 | 0 | 0 | 1 | 12 |
+- 总故障段表 `温度异常段.csv`:**96** 行(温度事件 49 + 高频波动 47)。
+- 温度事件:**49** 段;另有 1 小时观察段 **42** 条(单独在 `温度观察段.csv`,其中 **14** 条在 24h 内升级为事件)。
+- 三级高频波动:**47** 段(高频候选 **60** 段,未确认的留在 `温度高频候选.csv`,不再重复计数)。
+- 涵盖 4#~9#,统一阈值(一级/二级用同级相对;三级只用高频波动单独输出)。
+- 事件类型:持续偏高=36, 持续偏低=8, 混合=4, 单缸抬升=1。
+
+| 机组 | 单缸抬升 | 持续偏低 | 持续偏高 | 混合 | 合计 |
+|---|---|---|---|---|---|
+| 4号机 | 0 | 4 | 8 | 2 | 14 |
+| 5号机 | 1 | 2 | 14 | 1 | 18 |
+| 6号机 | 0 | 2 | 12 | 0 | 14 |
+| 7号机 | 0 | 0 | 2 | 1 | 3 |
 
 ## 2. 统一规则
 
 1. **数据有效性**:7/8/9 用转速;4# 用累计运行小时(+机身振动/进气压力兜底);5#/6# 用 2/4 信号(一级排气压力、一级进气压力、机身振动、调节阀开度);整级低于 45℃ 视为停机;单通道突然到环境温度并恢复视为“停机/通道异常”,不参与温度故障。
 2. **同级温差(常开特征)**:级差、级差较平时变化、每缸相对同级中位、每缸相对自身历史偏移;无事件小时也输出到 `同级温差特征.csv`。
 3. **短时单缸变化**:1h/3h/6h 同级相对变化;1h 记“观察”(单独输出、逐小时一行),2h 记“事件”;要求同方向连续 2 小时,并过滤“先降后升/先升后降”的过渡。
-4. **三级单缸**:`t3 ≈ a·med1 + b·med2 + c` 的跨级残差,长持续(≥6h)才出低置信度事件。
-5. **确认/滞回**:持续型 3h 确认;短时型 2h;观察 1h;相邻段间隔 ≤6h 合并。
-6. **阈值(统一)**:同级偏高/偏低 4/5、6/8、10/12℃;级差变化 4/8/15℃;短时 1h 3/4/6/9℃、3h 4/5/7/11℃、6h 6/7/9/13℃;三级残差 9.5/15/20℃(≥3h);三级高频波动:小时标准差倍数 2.5/3.5/5、标准差 ≥0.8、持续 ≥3h(单独表)。
+4. **确认/滞回**:持续型 3h 确认;短时型 2h;观察 1h;相邻段间隔 ≤6h 合并。
+5. **阈值(统一)**:同级偏高/偏低 4/5、6/8、10/12℃;级差变化 4/8/15℃;短时 1h 3/4/6/9℃、3h 4/5/7/11℃、6h 6/7/9/13℃;三级高频波动:先去慢趋势,再要求去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h(候选/确认分开);6h 单缸相对抬升 3/4.5/6℃、整级 6h 抬升在 ±3℃ 内、持续 ≥2h(已有持续偏高事件保持原类型;整级共同抬升只作特征,不作为事件)。
 
 ## 3. 维修事件回测(4#/5#/6#)
 
 | 机组 | 故障日期 | 描述 | 最大同级偏离℃ | 最大级差变化℃ | 命中 | 首个事件开始 | 提前小时 | 同日命中 | 通道异常命中 | 通道异常类型 |
 |---|---|---|---|---|---|---|---|---|---|---|
 | 4号机组 | 2026-06-10 | 4#压缩机一级2#3#缸温度异常 | 6.78 | 6.0 | 命中 | 2026-06-10 02:00 | -2.0 | 是 | 是 | 停机/通道异常 |
-| 5号机组 | 2026-03-26 | 5#机一级1#缸温度高 | 5.17 | 8.15 | 命中 | 2026-03-26 04:00 | -4.0 | 是 | 否 |  |
-| 5号机组 | 2026-04-01 | 5#机一级2#缸温度高 | 8.56 | 8.15 | 命中 | 2026-03-29 10:00 | 62.0 | 否 | 否 |  |
+| 5号机组 | 2026-03-26 | 5#机一级1#缸温度高 | 5.17 | 8.17 | 命中 | 2026-03-26 04:00 | -4.0 | 是 | 是 | 通道骤降 |
+| 5号机组 | 2026-04-01 | 5#机一级2#缸温度高 | 8.56 | 8.17 | 命中 | 2026-03-31 18:00 | 6.0 | 否 | 是 | 通道骤降 |
 | 5号机组 | 2026-04-08 | 5#压缩机一级2#缸温度高 | 10.02 | 9.73 | 命中 | 2026-04-06 14:00 | 34.0 | 否 | 否 |  |
 | 5号机组 | 2026-06-12 | 5#压缩机一级2#缸温度异常 | 10.14 | 9.41 | 命中 | 2026-06-11 12:00 | 12.0 | 否 | 是 | 停机/通道异常 |
 | 5号机组 | 2026-06-21 | 5#压缩机二级2#缸温度异常 | 9.09 | 8.75 | 命中 | 2026-06-21 01:00 | -1.0 | 是 | 否 |  |
 | 5号机组 | 2026-07-11 | 一级二缸排温高停机 |  |  | 未命中 |  |  | 否 | 否 |  |
-| 6号机组 | 2026-01-19 | 6#压缩机一级1#、3#缸温度高,导机 | 15.51 | 16.51 | 命中 | 2026-01-18 18:00 | 6.0 | 否 | 是 | 停机/通道异常 |
+| 6号机组 | 2026-01-19 | 6#压缩机一级1#、3#缸温度高,导机 | 7.96 | 9.08 | 命中 | 2026-01-18 18:00 | 6.0 | 否 | 是 | 停机/通道异常、通道骤降 |
 | 6号机组 | 2026-01-30 | 6#压缩机一级2#缸温度异常导机 | 13.76 | 12.47 | 命中 | 2026-01-30 08:00 | -8.0 | 是 | 否 |  |
-| 6号机组 | 2026-02-18 | 6#压缩机一级1#排气温度异常导致停机 | 2.0 | 4.99 | 命中 |  | 2.0 | 否 | 是 | 停机/通道异常 |
-| 6号机组 | 2026-02-27 | 6#压缩机一级3#缸温度异常导机 | 5.03 | 4.25 | 命中 | 2026-02-25 08:00 | 40.0 | 否 | 是 | 停机/通道异常 |
-| 6号机组 | 2026-04-22 | 6#机一级3缸排气温度高 | 10.3 | 10.17 | 命中 | 2026-04-20 07:00 | 41.0 | 否 | 是 | 停机/通道异常 |
+| 6号机组 | 2026-02-18 | 6#压缩机一级1#排气温度异常导致停机 | 0.72 | 0.27 | 命中 |  | -21.0 | 是 | 是 | 停机/通道异常、通道坏道 |
+| 6号机组 | 2026-02-27 | 6#压缩机一级3#缸温度异常导机 | 4.78 | 4.25 | 命中 | 2026-02-25 08:00 | 40.0 | 否 | 是 | 停机/通道异常 |
+| 6号机组 | 2026-04-22 | 6#机一级3缸排气温度高 | 10.29 | 10.17 | 命中 | 2026-04-20 07:00 | 41.0 | 否 | 是 | 停机/通道异常 |
 
 - 12 起中 11 起有数据的事件全部命中;5# 2026-07-11 超出批次 58 数据范围(截至 2026-06-30)。
 - 6# 2026-02-18 通过 **2/17 22:00 的通道骤降/停机异常**命中(2h 前),不再算未命中。
 - “提前小时”负数表示在故障日当天 0 点之后的同一日内命中;`同日命中=是` 更直观。
 
-## 4. 异常/严重事件清单(供复核)
+## 4. 异常/严重异常事件清单(供复核)
 
 | 机组 | 级 | 温度阶段 | 特征类型 | 方向 | 置信度 | 开始小时 | 结束小时 | 有效运行小时数 | 最大级差变化 | 最大同级偏离 | 最大同级偏低 | 最大同级相对3h | 阶段触发依据 |
 |---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-| 4号机 | 一级 | 严重 | 混合 | 混合 | 高 | 2025-12-07 19:00:00 | 2025-12-08 11:00:00 | 17 | 20.29 | 23.44 | 0.88 | 21.36 | 一级1#缸排气温度较同级中位+13.2℃(平时-0.2℃),较平时+13.4℃;一级1#缸排气温度较同级中位+23.2℃(平时-0.2℃),较平时+23.4℃;一级1#缸排气温度较同级中位+14.3℃(平时-0.2℃),较平时+14.6℃ |
+| 4号机 | 一级 | 严重异常 | 混合 | 混合 | 高 | 2025-12-07 19:00:00 | 2025-12-08 11:00:00 | 17 | 20.3 | 23.34 | 0.88 | 21.36 | 一级1#缸排气温度较同级中位+13.2℃(平时-0.1℃),较平时+13.3℃;一级1#缸排气温度较同级中位+23.2℃(平时-0.1℃),较平时+23.3℃;一级1#缸排气温度较同级中位+14.3℃(平时-0.1℃),较平时+14.5℃ |
 | 4号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-06-10 02:00:00 | 2026-06-10 08:00:00 | 7 | 6.0 | 6.78 | 0.46 | 5.0 | 一级2#缸排气温度较同级中位+4.1℃(平时+0.0℃),较平时+4.1℃;一级2#缸排气温度较同级中位+6.8℃(平时+0.0℃),较平时+6.8℃;一级2#缸排气温度较同级中位+6.6℃(平时+0.0℃),较平时+6.6℃ |
 | 4号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-06-11 21:00:00 | 2026-06-14 14:00:00 | 66 | -3.0 | 7.46 | 2.06 | 3.73 | 一级1#缸排气温度较同级中位+1.8℃(平时-5.5℃),较平时+7.3℃;一级1#缸排气温度较同级中位+1.4℃(平时-5.5℃),较平时+6.9℃;一级1#缸排气温度较同级中位+1.2℃(平时-5.5℃),较平时+6.7℃ |
-| 5号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2025-04-25 17:00:00 | 2025-04-26 08:00:00 | 16 | 15.74 | 15.98 | 0.43 | 11.73 | 一级3#缸排气温度较同级中位+6.2℃(平时+0.0℃),较平时+6.2℃;一级3#缸排气温度较同级中位+12.9℃(平时+0.0℃),较平时+12.9℃;一级3#缸排气温度较同级中位+14.6℃(平时+0.0℃),较平时+14.6℃ |
+| 5号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2025-04-25 17:00:00 | 2025-04-26 08:00:00 | 16 | 15.74 | 15.98 | 0.43 | 11.73 | 一级3#缸排气温度较同级中位+6.2℃(平时+0.0℃),较平时+6.2℃;一级3#缸排气温度较同级中位+12.9℃(平时+0.0℃),较平时+12.9℃;一级3#缸排气温度较同级中位+14.6℃(平时+0.0℃),较平时+14.6℃ |
 | 5号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2025-07-12 22:00:00 | 2025-07-13 09:00:00 | 12 | 5.81 | 6.39 | 0.17 | 5.29 | 一级2#缸排气温度较同级中位+5.3℃(平时+0.0℃),较平时+5.3℃;一级2#缸排气温度较同级中位+6.4℃(平时+0.0℃),较平时+6.4℃;一级2#缸排气温度较同级中位+6.3℃(平时+0.0℃),较平时+6.3℃ |
 | 5号机 | 二级 | 异常 | 持续偏高 | 偏高 | 高 | 2025-08-18 16:00:00 | 2025-08-19 09:00:00 | 18 | 9.68 | 9.57 | 0.96 | 7.0 | 二级2#缸排气温度较同级中位+6.5℃(平时+0.8℃),较平时+5.7℃;二级2#缸排气温度较同级中位+8.4℃(平时+0.8℃),较平时+7.6℃;二级2#缸排气温度较同级中位+8.3℃(平时+0.8℃),较平时+7.5℃ |
-| 5号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2025-11-18 04:00:00 | 2025-11-19 11:00:00 | 32 | 13.66 | 13.59 | 0.16 | 4.97 | 一级3#缸排气温度较同级中位+5.9℃(平时+1.5℃),较平时+4.4℃;一级3#缸排气温度较同级中位+7.6℃(平时+1.5℃),较平时+6.1℃;一级3#缸排气温度较同级中位+9.8℃(平时+1.5℃),较平时+8.3℃ |
-| 5号机 | 一级 | 异常 | 持续偏低 | 偏低 | 高 | 2025-11-24 18:00:00 | 2025-11-25 14:00:00 | 21 | -7.34 | 0.8 | 8.27 | 0.89 | 一级3#缸排气温度较同级中位+2.3℃(平时+10.5℃),较平时-8.2℃;一级3#缸排气温度较同级中位+2.2℃(平时+10.5℃),较平时-8.2℃;一级3#缸排气温度较同级中位+2.2℃(平时+10.5℃),较平时-8.3℃ |
-| 5号机 | 一级 | 异常 | 混合 | 混合 | 中 | 2025-12-10 13:00:00 | 2025-12-13 05:00:00 | 63 | 9.92 | 11.37 | 9.5 | 11.62 | 1h同级升11.2℃;一级2#缸排气温度较同级中位-6.8℃(平时-1.8℃),较平时-5.0℃;3h同级升11.6℃;一级2#缸排气温度较同级中位-6.8℃(平时-1.8℃),较平时-5.0℃;3h同级升11.4℃;一级2#缸排气温度较同级中位-6.9℃(平时-1.8℃),较平时-5.1℃ |
-| 5号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-03-26 04:00:00 | 2026-03-26 14:00:00 | 11 | 8.15 | 5.17 | 4.57 | 3.98 | 级差7.6℃(一级3#缸排气温度-一级2#缸排气温度,平时1.6℃)较平时+6.0℃;级差8.3℃(一级3#缸排气温度-一级2#缸排气温度,平时1.6℃)较平时+6.7℃;一级3#缸排气温度较同级中位+5.0℃(平时+0.0℃),较平时+5.0℃ |
+| 5号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2025-11-18 04:00:00 | 2025-11-19 11:00:00 | 32 | 13.66 | 13.59 | 0.16 | 4.97 | 一级3#缸排气温度较同级中位+5.9℃(平时+1.5℃),较平时+4.4℃;一级3#缸排气温度较同级中位+7.6℃(平时+1.5℃),较平时+6.1℃;一级3#缸排气温度较同级中位+9.8℃(平时+1.5℃),较平时+8.3℃ |
+| 5号机 | 一级 | 异常 | 持续偏低 | 偏低 | 高 | 2025-11-24 18:00:00 | 2025-11-25 14:00:00 | 21 | -7.34 | 0.8 | 8.27 | 0.8 | 一级3#缸排气温度较同级中位+2.3℃(平时+10.5℃),较平时-8.2℃;一级3#缸排气温度较同级中位+2.2℃(平时+10.5℃),较平时-8.2℃;一级3#缸排气温度较同级中位+2.2℃(平时+10.5℃),较平时-8.3℃ |
+| 5号机 | 一级 | 异常 | 混合 | 混合 | 中 | 2025-12-10 13:00:00 | 2025-12-11 14:00:00 | 26 | 6.98 | 6.76 | 5.32 | 11.62 | 1h同级升11.2℃;一级2#缸排气温度较同级中位-6.8℃(平时-1.8℃),较平时-5.0℃;3h同级升11.6℃;一级2#缸排气温度较同级中位-6.8℃(平时-1.8℃),较平时-5.0℃;3h同级升11.4℃;一级2#缸排气温度较同级中位-6.9℃(平时-1.8℃),较平时-5.1℃ |
+| 5号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-03-26 04:00:00 | 2026-03-26 14:00:00 | 11 | 8.17 | 5.17 | 4.57 | 3.98 | 级差7.6℃(一级3#缸排气温度-一级2#缸排气温度,平时1.6℃)较平时+6.0℃;级差8.3℃(一级3#缸排气温度-一级2#缸排气温度,平时1.6℃)较平时+6.7℃;一级3#缸排气温度较同级中位+5.0℃(平时+0.0℃),较平时+5.0℃ |
 | 5号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-03-27 13:00:00 | 2026-03-28 18:00:00 | 30 | -0.23 | 8.56 | 0.37 | 0.3 | 一级2#缸排气温度较同级中位+3.7℃(平时-4.4℃),较平时+8.1℃;一级2#缸排气温度较同级中位+3.7℃(平时-4.4℃),较平时+8.0℃;一级2#缸排气温度较同级中位+3.8℃(平时-4.4℃),较平时+8.2℃ |
-| 5号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2026-06-11 12:00:00 | 2026-06-11 17:00:00 | 6 | 9.41 | 10.14 | 0.04 | 8.75 | 一级2#缸排气温度较同级中位+7.5℃(平时+0.0℃),较平时+7.5℃;一级2#缸排气温度较同级中位+9.9℃(平时+0.0℃),较平时+9.9℃;一级2#缸排气温度较同级中位+10.0℃(平时+0.0℃),较平时+10.0℃ |
+| 5号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2026-06-11 12:00:00 | 2026-06-11 17:00:00 | 6 | 9.41 | 10.14 | 0.04 | 8.75 | 一级2#缸排气温度较同级中位+7.5℃(平时+0.0℃),较平时+7.5℃;一级2#缸排气温度较同级中位+9.9℃(平时+0.0℃),较平时+9.9℃;一级2#缸排气温度较同级中位+10.0℃(平时+0.0℃),较平时+10.0℃ |
 | 5号机 | 二级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-06-21 01:00:00 | 2026-06-21 15:00:00 | 14 | 8.75 | 9.09 |  | 5.22 | 二级2#缸排气温度较同级中位+7.4℃(平时+1.0℃),较平时+6.3℃;二级2#缸排气温度较同级中位+8.9℃(平时+1.0℃),较平时+7.9℃;二级2#缸排气温度较同级中位+7.9℃(平时+1.0℃),较平时+6.9℃ |
-| 6号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2025-02-08 12:00:00 | 2025-02-08 14:00:00 | 3 | 31.35 | 32.39 | 0.27 | 28.41 | 一级3#缸排气温度较同级中位+17.7℃(平时+0.0℃),较平时+17.7℃;一级3#缸排气温度较同级中位+19.2℃(平时+0.0℃),较平时+19.2℃;一级3#缸排气温度较同级中位+32.4℃(平时+0.0℃),较平时+32.4℃ |
+| 6号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2025-02-08 12:00:00 | 2025-02-08 14:00:00 | 3 | 31.35 | 32.39 | 0.27 | 28.41 | 一级3#缸排气温度较同级中位+17.7℃(平时+0.0℃),较平时+17.7℃;一级3#缸排气温度较同级中位+19.2℃(平时+0.0℃),较平时+19.2℃;一级3#缸排气温度较同级中位+32.4℃(平时+0.0℃),较平时+32.4℃ |
 | 6号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2025-06-01 14:00:00 | 2025-06-02 08:00:00 | 19 | 11.26 | 9.59 | 2.03 | 5.97 | 一级2#缸排气温度较同级中位+7.1℃(平时+0.5℃),较平时+6.6℃;一级2#缸排气温度较同级中位+7.0℃(平时+0.5℃),较平时+6.5℃;一级2#缸排气温度较同级中位+7.1℃(平时+0.5℃),较平时+6.5℃ |
-| 6号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2025-06-14 00:00:00 | 2025-06-14 09:00:00 | 10 | 11.5 | 12.71 | 0.3 | 6.41 | 一级3#缸排气温度较同级中位+6.5℃(平时+0.0℃),较平时+6.5℃;一级3#缸排气温度较同级中位+6.2℃(平时+0.0℃),较平时+6.2℃;一级3#缸排气温度较同级中位+6.0℃(平时+0.0℃),较平时+6.0℃ |
-| 6号机 | 一级 | 异常 | 混合 | 混合 | 高 | 2025-10-30 10:00:00 | 2025-10-30 11:00:00 | 2 | 9.76 | 10.18 | 1.24 | 11.34 | 一级2#缸排气温度较同级中位+9.9℃(平时-0.2℃),较平时+10.2℃;1h同级降11.5℃ |
-| 6号机 | 二级 | 异常 | 持续偏高 | 偏高 | 高 | 2025-11-11 11:00:00 | 2025-11-12 15:00:00 | 29 | 5.61 | 6.3 | 0.28 | 5.01 | 二级3#缸排气温度较同级中位+5.9℃(平时-0.4℃),较平时+6.3℃;二级3#缸排气温度较同级中位+5.8℃(平时-0.4℃),较平时+6.2℃;二级3#缸排气温度较同级中位+5.7℃(平时-0.4℃),较平时+6.0℃ |
-| 6号机 | 一级 | 严重 | 混合 | 混合 | 高 | 2026-01-18 10:00:00 | 2026-01-19 10:00:00 | 25 | 16.51 | 15.51 | 2.15 | 16.28 | 一级3#缸排气温度较同级中位+20.2℃(平时+4.7℃),较平时+15.5℃;一级3#缸排气温度较同级中位+9.9℃(平时+4.7℃),较平时+5.2℃;一级3#缸排气温度较同级中位+9.8℃(平时+4.7℃),较平时+5.1℃ |
+| 6号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2025-06-14 00:00:00 | 2025-06-14 09:00:00 | 10 | 11.5 | 12.71 | 0.3 | 6.41 | 一级3#缸排气温度较同级中位+6.5℃(平时+0.0℃),较平时+6.5℃;一级3#缸排气温度较同级中位+6.2℃(平时+0.0℃),较平时+6.2℃;一级3#缸排气温度较同级中位+6.0℃(平时+0.0℃),较平时+6.0℃ |
+| 6号机 | 二级 | 异常 | 持续偏高 | 偏高 | 高 | 2025-11-11 11:00:00 | 2025-11-12 10:00:00 | 23 | 5.61 | 6.31 | 0.16 | 5.01 | 二级3#缸排气温度较同级中位+5.9℃(平时-0.4℃),较平时+6.3℃;二级3#缸排气温度较同级中位+5.8℃(平时-0.4℃),较平时+6.2℃;二级3#缸排气温度较同级中位+5.7℃(平时-0.4℃),较平时+6.0℃ |
 | 6号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-01-30 08:00:00 | 2026-01-30 09:00:00 | 2 | 12.47 | 13.76 | 0.47 | 10.88 | 一级2#缸排气温度较同级中位+8.5℃(平时+0.0℃),较平时+8.5℃;一级2#缸排气温度较同级中位+13.8℃(平时+0.0℃),较平时+13.8℃ |
 | 6号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-02-06 12:00:00 | 2026-02-07 11:00:00 | 24 | 6.27 | 6.34 | 1.38 | 0.32 | 一级3#缸排气温度较同级中位+6.2℃(平时+0.0℃),较平时+6.2℃;一级3#缸排气温度较同级中位+6.1℃(平时+0.0℃),较平时+6.1℃;一级3#缸排气温度较同级中位+6.0℃(平时+0.0℃),较平时+6.0℃ |
-| 6号机 | 一级 | 严重 | 持续偏高 | 偏高 | 高 | 2026-04-19 10:00:00 | 2026-04-21 15:00:00 | 54 | 10.17 | 10.3 | 3.7 | 9.19 | 一级3#缸排气温度较同级中位+10.8℃(平时+0.5℃),较平时+10.3℃;一级3#缸排气温度较同级中位+9.9℃(平时+0.5℃),较平时+9.4℃;一级3#缸排气温度较同级中位+9.7℃(平时+0.5℃),较平时+9.2℃ |
-| 6号机 | 一级 | 异常 | 持续偏低 | 偏低 | 高 | 2026-04-25 12:00:00 | 2026-04-26 14:00:00 | 27 | -8.12 | 1.36 | 8.7 | 0.18 | 一级3#缸排气温度较同级中位+0.0℃(平时+8.7℃),较平时-8.7℃;一级3#缸排气温度较同级中位+0.0℃(平时+8.6℃),较平时-8.6℃ |
-| 7号机 | 一级 | 异常 | 持续偏高 | 偏高 | 高 | 2026-01-11 22:00:00 | 2026-01-12 03:00:00 | 6 | 5.9 | 6.67 | 3.98 | 2.12 | 一级6列缸排气温度较同级中位+4.1℃(平时-0.4℃),较平时+4.5℃;一级6列缸排气温度较同级中位+4.9℃(平时-0.4℃),较平时+5.3℃;一级6列缸排气温度较同级中位+6.3℃(平时-0.4℃),较平时+6.7℃ |
-| 7号机 | 一级 | 严重 | 混合 | 混合 | 高 | 2026-01-12 05:00:00 | 2026-01-13 09:00:00 | 29 | 24.58 | 24.84 | 1.36 | 14.45 | 一级6列缸排气温度较同级中位+6.1℃(平时-0.4℃),较平时+6.4℃;一级6列缸排气温度较同级中位+6.2℃(平时-0.4℃),较平时+6.6℃;一级6列缸排气温度较同级中位+6.6℃(平时+1.1℃),较平时+5.4℃ |
-| 8号机 | 一级 | 严重 | 短时突升 | 偏高 | 中 | 2025-10-01 15:00:00 | 2025-10-01 16:00:00 | 2 | -0.01 | 0.01 | 0.01 | 11.11 | 3h同级升11.1℃;6h同级升11.1℃ |
-| 9号机 | 一级 | 严重 | 短时突升 | 偏高 | 中 | 2025-07-21 15:00:00 | 2025-07-21 16:00:00 | 2 | -0.04 | 0.16 |  | 11.85 | 3h同级升11.8℃;6h同级升11.9℃ |
+| 6号机 | 一级 | 严重异常 | 持续偏高 | 偏高 | 高 | 2026-04-19 10:00:00 | 2026-04-21 15:00:00 | 54 | 10.17 | 10.29 | 3.7 | 9.19 | 一级3#缸排气温度较同级中位+10.8℃(平时+0.5℃),较平时+10.3℃;一级3#缸排气温度较同级中位+9.9℃(平时+0.5℃),较平时+9.4℃;一级3#缸排气温度较同级中位+9.7℃(平时+0.5℃),较平时+9.2℃ |
+| 6号机 | 一级 | 异常 | 持续偏低 | 偏低 | 高 | 2026-04-25 12:00:00 | 2026-04-26 14:00:00 | 27 | -8.12 | 1.36 | 8.7 | 0.13 | 一级3#缸排气温度较同级中位+0.0℃(平时+8.7℃),较平时-8.7℃;一级3#缸排气温度较同级中位+0.0℃(平时+8.6℃),较平时-8.6℃ |
+| 7号机 | 一级 | 严重异常 | 混合 | 混合 | 高 | 2026-01-11 22:00:00 | 2026-01-13 09:00:00 | 36 | 24.58 | 24.84 | 3.98 | 14.45 | 一级6列缸排气温度较同级中位+4.1℃(平时-0.4℃),较平时+4.5℃;一级6列缸排气温度较同级中位+4.9℃(平时-0.4℃),较平时+5.3℃;一级6列缸排气温度较同级中位+6.3℃(平时-0.4℃),较平时+6.7℃ |
 
 ## 5. 温度通道异常
 
 | 机组 | 停机/通道异常 | 通道冻值 | 通道坏道 | 通道骤降 |
 |---|---|---|---|---|
-| 4号机 | 72 | 7 | 1 | 0 |
-| 5号机 | 101 | 0 | 1 | 0 |
-| 6号机 | 88 | 0 | 0 | 0 |
-| 7号机 | 137 | 0 | 3 | 6 |
-| 8号机 | 105 | 0 | 3 | 2 |
-| 9号机 | 95 | 0 | 1 | 4 |
+| 4号机 | 72 | 6 | 1 | 9 |
+| 5号机 | 108 | 0 | 0 | 34 |
+| 6号机 | 106 | 0 | 7 | 47 |
+| 7号机 | 163 | 0 | 3 | 9 |
+| 8号机 | 112 | 0 | 4 | 3 |
+| 9号机 | 115 | 0 | 1 | 20 |
 
-- 通道异常总段数 **626**,其中“显著” **617** 段(持续≥2h / 坏道 / 冻值);复核时可先看显著项。
+- 通道异常总段数 **820**,其中“显著” **735** 段(持续≥2h / 坏道 / 冻值);复核时可先看显著项。
 
 典型例子:
 
 | 机组 | 点位描述 | 异常类型 | 开始小时 | 结束小时 | 持续自然小时数 | 最小值 | 最大值 | 同级基准中位 |
 |---|---|---|---|---|---|---|---|---|
-| 4号机 | 二级3#缸排气温度 | 停机/通道异常 | 2026-01-15 19:00:00 | 2026-01-15 21:00:00 | 3 | 0.0 | 89.93 | 101.24 |
-| 6号机 | 二级1#缸排气温度 | 停机/通道异常 | 2026-02-17 19:00:00 | 2026-02-17 21:00:00 | 3 | 0.0 | 95.18 | 111.33 |
-| 6号机 | 一级1#缸排气温度 | 停机/通道异常 | 2026-02-17 22:00:00 | 2026-02-17 23:00:00 | 2 | 0.0 | 58.35 | 94.21 |
+| 4号机 | 二级3#缸排气温度 | 停机/通道异常 | 2026-01-15 19:00:00 | 2026-01-15 21:00:00 | 3 | 0.0 | 0.0 | 106.1 |
+| 6号机 | 二级1#缸排气温度 | 停机/通道异常 | 2026-02-17 19:00:00 | 2026-02-17 21:00:00 | 3 | 0.0 | 0.0 | 114.13 |
+| 6号机 | 一级1#缸排气温度 | 停机/通道异常 | 2026-02-17 22:00:00 | 2026-02-17 22:00:00 | 1 | 0.0 | 0.0 | 94.82 |
 
-## 6. 7#/8#/9# 三级低置信度事件
+## 6. 7#/8#/9# 三级高频波动
 
-| 机组 | 温度阶段 | 段数 |
-|---|---|---|
-| 7号机 | 轻微 | 1 |
-| 9号机 | 轻微 | 11 |
-
-- 三级只做“跨级相对 + 长持续(≥3h)”,不参与 1h/2h 短时触发,置信度统一标“低”;高频波动见第 7 节。
-- 9# 2026-01-18 三级活塞杆断裂事件前没有有效运行数据,无法回测;8# 2025-12-06 事件前数据稀疏。
-
-## 7. 7#/8#/9# 三级高频波动
-
-- 高频波动单独输出到 `温度高频波动段.csv`,不计入上面的 67 条确认事件。
-- 判定:小时标准差 / 近 168 个有效小时正常中位数;倍数 2.5/3.5/5,标准差 ≥0.8,持续 ≥3h。
+- 高频波动是 `温度异常段.csv` 中的 `特征类型=高频波动` 行,`温度高频波动段.csv` 为确认后的过滤副本;`温度高频候选.csv` 保留全部首轮候选及是否确认。温度事件仍为上面的 49 条。
+- 判定:先去慢趋势,再要求去趋势残差标准差 ≥0.5℃、反复升降 ≥5 次/小时、持续 ≥3h;首轮候选 60 段,确认 47 段。
 - 目前只对单缸的三级输出;一级/二级暂不输出。
 
 | 机组 | 级 | 温度阶段 | 段数 |
 |---|---|---|---|
-| 7号机 | 三级 | 严重 | 2 |
-| 7号机 | 三级 | 异常 | 9 |
-| 7号机 | 三级 | 轻微 | 7 |
-| 8号机 | 三级 | 严重 | 10 |
-| 8号机 | 三级 | 异常 | 4 |
-| 8号机 | 三级 | 轻微 | 12 |
-| 9号机 | 三级 | 严重 | 5 |
+| 7号机 | 三级 | 异常 | 2 |
+| 7号机 | 三级 | 轻微 | 9 |
+| 8号机 | 三级 | 严重异常 | 9 |
+| 8号机 | 三级 | 异常 | 3 |
+| 8号机 | 三级 | 轻微 | 11 |
+| 9号机 | 三级 | 严重异常 | 3 |
 | 9号机 | 三级 | 异常 | 4 |
-| 9号机 | 三级 | 轻微 | 8 |
+| 9号机 | 三级 | 轻微 | 6 |
 
 典型例子:
 
@@ -137,25 +119,26 @@
 |---|---|---|---|---|---|---|---|---|
 | 9号机 | 三级 | 轻微 | 2026-04-04 00:00:00 | 2026-04-04 07:00:00 | 8 | 3.36 | 1.7 | 0.51 |
 
-## 8. 演化周期
+## 7. 演化周期
 
 `温度演化周期.csv` 按 **每次开机周期 × 级** 一行,包含:
 
 - 阶段演化顺序、方向、特征类型、置信度;
-- 观察/轻微/异常/严重各阶段起止与运行小时数;
+- 观察/轻微/异常/严重异常各阶段起止与运行小时数;
 - 峰值时刻/峰值缸、最大级差变化、最大同级偏高/偏低;
 - 首次短时触发、首次持续触发、关联通道异常。
 
-## 9. 运行态加强后的变化
+## 8. 运行态加强后的变化
 
 - 4# 改用**累计运行小时** `YSJ_31`(+1/h 运行、0 停机);5#/6# 改用 **2/4 信号**(一级排气压力、一级进气压力、机身振动、调节阀开度)。
 - 与旧版“一级进气 >0.15”相比,剔除了大量“油泵在转但压缩机已停/卸载”的小时:4# 约 117h、5# 约 101h、6# 约 669h。
-- 因此有 **9 个旧事件落在启停过渡段**,新版不再作为确认事件:4# 2026-02-15、2026-03-24、2026-04-04、2026-04-25、2026-04-26、2026-05-30;5# 2025-05-09;7# 2025-02-17;8# 2025-01-18。它们多数是开机/停机温度爬坡,不是稳定运行故障;如需要,可单独输出“过渡段”供复核。
+- 温度小时均值已排除 0 值;通道掉点用原始最小值和零值样本数标记,恢复段不再被当成上升;短时变化要求当前值高于近期 6h 中位。
+- 单缸 6h 相对抬升并入事件(类型 `单缸抬升`):阈值 3/4.5/6℃,且整级 6h 抬升在 ±3℃ 内;已有 `持续偏高` 事件保持原类型,不重新分类。整级共同抬升只保留为特征,不生成事件。
+- 因此有 **9 个旧事件落在启停过渡段**,新版不再作为确认事件:4# 2026-02-15、2026-03-24、2026-04-04、2026-04-25、2026-04-26、2026-05-30;5# 2025-05-09;7# 2025-02-17;8# 2025-01-18。它们多数是开机/停机温度爬坡,不是稳定运行故障;这些过渡段只保留在 `温度过渡段.csv`,不在页面和确认事件中展示。
 
-## 10. 限制与下一步
+## 9. 限制与下一步
 
 1. 4/5/6 无转速,运行态已用累计运行小时/2-of-4 信号加强;极低负荷小时仍可能有少量误判。
 2. 通道异常表较大(单点级,包含大量 1–2h 采样跌落);建议先按“持续≥2h 或 坏道/冻值”筛选复核。
-3. 三级残差 R² 只有 0.38~0.61,三级事件只作低置信度提示,不直接报警。
-4. 现有 level 阈值已由你复核为真事件,暂不提高;短时/偏低/三级事件建议再做一轮现场复核后微调。
-5. 规则稳定后再合并进 `models/temperature/`,并接入 `compressor_alarm`。
+3. 现有 level 阈值已由你复核为真事件,暂不提高;短时/偏低事件建议再做一轮现场复核后微调。
+4. 规则稳定后再合并进 `models/temperature/`,并接入 `compressor_alarm`。

+ 8 - 8
_tmp_temperature/out/回测_温度事件.csv

@@ -1,13 +1,13 @@
 机组,故障日期,描述,关注级,最大同级偏离℃,最大级差变化℃,命中,首个事件开始,提前小时,命中等级,通道异常命中,通道异常类型,通道异常开始,同日命中
-4号机组,2026-06-10,4#压缩机一级2#3#缸温度异常,一级,6.78,6.0,命中,2026-06-10 02:00,-2.0,异常、轻微,是,停机/通道异常,2026-06-09 13:00,是
-5号机组,2026-03-26,5#机一级1#缸温度高,一级,5.17,8.15,命中,2026-03-26 04:00,-4.0,异常,否,,,是
-5号机组,2026-04-01,5#机一级2#缸温度高,一级,8.56,8.15,命中,2026-03-29 10:00,62.0,异常、轻微,否,,,否
+4号机组,2026-06-10,4#压缩机一级2#3#缸温度异常,一级,6.78,6.0,命中,2026-06-10 02:00,-2.0,异常、轻微,是,停机/通道异常,2026-06-09 12:00,是
+5号机组,2026-03-26,5#机一级1#缸温度高,一级,5.17,8.17,命中,2026-03-26 04:00,-4.0,异常,是,通道骤降,2026-03-25 10:00,是
+5号机组,2026-04-01,5#机一级2#缸温度高,一级,8.56,8.17,命中,2026-03-31 18:00,6.0,异常、轻微,是,通道骤降,2026-03-31 18:00,否
 5号机组,2026-04-08,5#压缩机一级2#缸温度高,一级,10.02,9.73,命中,2026-04-06 14:00,34.0,轻微,否,,,否
-5号机组,2026-06-12,5#压缩机一级2#缸温度异常,一级,10.14,9.41,命中,2026-06-11 12:00,12.0,严重,是,停机/通道异常,2026-06-05 03:00,否
+5号机组,2026-06-12,5#压缩机一级2#缸温度异常,一级,10.14,9.41,命中,2026-06-11 12:00,12.0,严重异常,是,停机/通道异常,2026-06-05 03:00,否
 5号机组,2026-06-21,5#压缩机二级2#缸温度异常,二级,9.09,8.75,命中,2026-06-21 01:00,-1.0,异常,否,,,是
 5号机组,2026-07-11,一级二缸排温高停机,一级,,,未命中,,,,否,,,否
-6号机组,2026-01-19,6#压缩机一级1#、3#缸温度高,导机,一级,15.51,16.51,命中,2026-01-18 18:00,6.0,严重,是,停机/通道异常,2026-01-18 18:00,否
+6号机组,2026-01-19,6#压缩机一级1#、3#缸温度高,导机,一级,7.96,9.08,命中,2026-01-18 18:00,6.0,轻微,是,停机/通道异常、通道骤降,2026-01-18 18:00,否
 6号机组,2026-01-30,6#压缩机一级2#缸温度异常导机,一级,13.76,12.47,命中,2026-01-30 08:00,-8.0,异常、轻微,否,,,是
-6号机组,2026-02-18,6#压缩机一级1#排气温度异常导致停机,一级,2.0,4.99,命中,,2.0,通道异常,是,停机/通道异常,2026-02-17 22:00,否
-6号机组,2026-02-27,6#压缩机一级3#缸温度异常导机,一级,5.03,4.25,命中,2026-02-25 08:00,40.0,轻微,是,停机/通道异常,2026-02-25 08:00,否
-6号机组,2026-04-22,6#机一级3缸排气温度高,一级,10.3,10.17,命中,2026-04-20 07:00,41.0,严重,是,停机/通道异常,2026-04-20 07:00,否
+6号机组,2026-02-18,6#压缩机一级1#排气温度异常导致停机,一级,0.72,0.27,命中,,-21.0,通道异常,是,停机/通道异常、通道坏道,2026-02-18 21:00,是
+6号机组,2026-02-27,6#压缩机一级3#缸温度异常导机,一级,4.78,4.25,命中,2026-02-25 08:00,40.0,轻微,是,停机/通道异常,2026-02-25 08:00,否
+6号机组,2026-04-22,6#机一级3缸排气温度高,一级,10.29,10.17,命中,2026-04-20 07:00,41.0,严重异常,是,停机/通道异常,2026-04-20 07:00,否

Разница между файлами не показана из-за своего большого размера
+ 97 - 68
_tmp_temperature/out/温度异常段.csv


+ 32 - 393
_tmp_temperature/out/温度观察段.csv

@@ -1,404 +1,43 @@
 机组,批次,周期编号,小时,级,方向,特征类型,置信度,最高温度,级差,级差变化,最大同级偏离,最大同级偏低,最大同级相对1h,最大同级相对3h,最大同级相对6h,判定依据,关联周期编号,关联事件开始,关联事件等级,是否升级为事件
-4号机,56,4-T001,2025-10-22 05:00:00,二级,偏低,短时突降,中,103.86,2.84,-2.19,2.07,3.81,-5.77,-5.84,-5.78,1h同级降5.8℃,,,,否
-4号机,56,4-T001,2025-10-22 08:00:00,二级,偏高,短时突升,中,107.11,5.59,0.57,0.16,0.4,0.2,6.03,-0.19,3h同级升6.0℃,,,,否
-4号机,56,4-T001,2025-10-22 11:00:00,二级,偏高,短时突升,中,111.89,5.98,0.94,0.74,0.2,-0.55,0.38,6.62,6h同级升6.6℃,,,,否
-4号机,56,4-T001,2025-10-23 15:00:00,二级,混合,混合,中,111.02,34.59,29.39,2.33,35.41,-37.59,-37.97,-37.45,级差34.6℃(二级2#缸排气温度-二级1#缸排气温度,平时5.2℃)较平时+29.4℃;二级1#缸排气温度较同级中位-32.3℃(平时+3.2℃),较平时-35.4℃,,,,否
-4号机,56,4-T001,2025-10-23 21:00:00,二级,偏高,短时突升,中,111.79,5.22,0.04,0.42,,0.15,0.18,37.47,6h同级升37.5℃,,,,否
-4号机,56,4-T001,2025-10-25 05:00:00,二级,混合,混合,中,110.05,11.58,6.33,0.0,6.7,-5.62,-5.58,-5.82,级差11.6℃(二级1#缸排气温度-二级3#缸排气温度,平时5.3℃)较平时+6.3℃;二级3#缸排气温度较同级中位-8.7℃(平时-2.0℃),较平时-6.7℃,,,,否
-4号机,56,4-T001,2025-10-25 08:00:00,二级,偏高,短时突升,中,110.89,5.89,0.64,0.0,1.0,0.05,5.7,-0.11,3h同级升5.7℃,,,,否
-4号机,56,4-T002,2025-11-07 18:00:00,一级,混合,混合,中,102.0,1.47,-0.01,0.74,,3.07,0.0,0.04,1h同级升3.1℃;1h同级降3.1℃,,,,否
-4号机,56,4-T003,2025-11-16 05:00:00,一级,混合,混合,中,101.0,7.5,5.72,0.64,5.24,-5.5,-5.11,-5.67,级差7.5℃(一级3#缸排气温度-一级2#缸排气温度,平时1.8℃)较平时+5.7℃;一级2#缸排气温度较同级中位-6.7℃(平时-1.4℃),较平时-5.2℃,,,,否
-4号机,56,4-T003,2025-11-16 08:00:00,一级,偏高,短时突升,中,101.53,1.85,0.06,0.23,,0.27,5.26,0.27,3h同级升5.3℃,,,,否
-4号机,56,4-T003,2025-11-16 10:00:00,二级,混合,短时突降,中,106.39,9.3,3.66,3.08,9.07,0.02,-11.85,-12.01,3h同级降11.9℃,,,,否
-4号机,56,4-T003,2025-11-16 11:00:00,二级,混合,短时突升,中,112.07,5.88,0.25,0.0,0.23,12.08,0.08,-0.1,1h同级升12.1℃,,,,否
-4号机,56,4-T003,2025-11-16 13:00:00,二级,偏高,短时突升,中,111.65,5.61,-0.03,0.0,0.23,0.16,11.83,0.15,3h同级升11.8℃,,,,否
-4号机,56,4-T003,2025-11-16 16:00:00,二级,偏高,短时突升,中,109.54,5.4,-0.24,0.31,0.03,-0.42,0.21,11.62,6h同级升11.6℃,,,,否
-4号机,56,4-T003,2025-11-20 10:00:00,二级,混合,短时突降,中,104.32,9.12,3.49,3.03,8.92,0.08,-11.26,-11.19,3h同级降11.3℃,,,,否
-4号机,56,4-T003,2025-11-20 11:00:00,二级,混合,短时突升,中,109.25,5.57,-0.05,0.0,0.12,11.66,0.31,-0.49,1h同级升11.7℃,,,,否
-4号机,56,4-T003,2025-11-20 13:00:00,二级,偏高,短时突升,中,113.0,5.71,0.09,0.0,0.13,-0.08,11.8,-0.54,3h同级升11.8℃,,,,否
-4号机,56,4-T003,2025-11-20 16:00:00,二级,偏高,短时突升,中,111.13,5.4,-0.22,0.32,,0.26,0.32,11.49,6h同级升11.5℃,,,,否
-4号机,56,4-T003,2025-11-23 20:00:00,一级,偏高,持续偏高,高,105.0,5.0,3.05,4.05,0.06,-0.34,-0.23,1.94,一级3#缸排气温度较同级中位+4.9℃(平时+0.9℃),较平时+4.1℃,4-T003,2025-11-23 23:00:00,轻微,是
-4号机,56,4-T003,2025-11-24 02:00:00,一级,偏高,持续偏高,高,103.97,5.97,4.01,4.07,1.0,0.56,-0.97,-0.94,一级3#缸排气温度较同级中位+5.0℃(平时+0.9℃),较平时+4.1℃,4-T003,2025-11-24 08:00:00,轻微,是
-4号机,56,4-T003,2025-11-25 13:00:00,一级,偏高,持续偏高,高,106.0,5.45,3.45,4.0,0.45,-0.17,-0.04,-0.13,一级3#缸排气温度较同级中位+5.0℃(平时+1.0℃),较平时+4.0℃,4-T003,2025-11-26 01:00:00,轻微,是
-4号机,56,4-T003,2025-11-25 15:00:00,一级,偏高,持续偏高,高,107.67,5.14,3.14,4.11,,-0.09,-0.18,-0.58,一级3#缸排气温度较同级中位+5.1℃(平时+1.0℃),较平时+4.1℃,4-T003,2025-11-26 01:00:00,轻微,是
-4号机,56,4-T003,2025-11-26 09:00:00,一级,偏高,持续偏高,高,103.69,5.67,3.67,4.13,0.53,-0.4,-0.26,-0.17,一级3#缸排气温度较同级中位+5.1℃(平时+1.0℃),较平时+4.1℃,,,,否
-4号机,56,4-T006,2025-12-24 12:00:00,二级,偏低,短时突降,中,102.93,7.98,2.75,2.12,9.07,-11.65,-11.73,-12.73,1h同级降11.6℃,,,,否
-4号机,56,4-T006,2025-12-24 15:00:00,二级,偏高,短时突升,中,108.57,6.95,1.72,1.92,0.01,0.12,12.81,0.99,3h同级升12.8℃,,,,否
-4号机,56,4-T006,2025-12-24 18:00:00,二级,偏高,短时突升,中,107.37,7.37,2.14,2.46,,0.27,0.42,13.35,6h同级升13.3℃,,,,否
-4号机,56,4-T006,2025-12-27 10:00:00,二级,混合,混合,中,103.66,17.62,10.62,0.3,10.3,0.04,-10.33,-9.95,级差17.6℃(二级1#缸排气温度-二级3#缸排气温度,平时7.0℃)较平时+10.6℃;二级3#缸排气温度较同级中位-11.9℃(平时-1.6℃),较平时-10.3℃,,,,否
-4号机,56,4-T006,2025-12-27 11:00:00,二级,混合,短时突升,中,106.07,7.02,0.02,0.23,,10.51,0.14,-0.52,1h同级升10.5℃,,,,否
-4号机,56,4-T006,2025-12-27 13:00:00,二级,偏高,短时突升,中,109.62,8.6,1.6,0.61,0.95,-0.48,9.02,-1.0,3h同级升9.0℃,,,,否
-4号机,56,4-T006,2025-12-27 16:00:00,二级,偏高,短时突升,中,110.13,6.87,-0.13,0.44,,-0.28,1.38,10.72,6h同级升10.7℃,,,,否
-4号机,56,4-T006,2026-01-09 15:00:00,一级,偏高,持续偏高,高,103.11,3.18,1.18,4.25,0.07,-0.43,0.86,-0.52,一级2#缸排气温度较同级中位+3.1℃(平时-1.1℃),较平时+4.3℃,4-T006,2026-01-09 19:00:00,轻微,是
-4号机,56,4-T006,2026-01-09 17:00:00,一级,偏高,持续偏高,高,102.0,3.57,1.57,4.06,0.64,0.07,-0.24,-0.49,一级2#缸排气温度较同级中位+2.9℃(平时-1.1℃),较平时+4.1℃,4-T006,2026-01-09 19:00:00,轻微,是
-4号机,56,4-T008,2026-01-17 05:00:00,一级,偏低,短时突降,中,96.0,3.44,0.44,1.0,4.66,-5.44,-5.04,-5.71,1h同级降5.4℃,,,,否
-4号机,56,4-T008,2026-01-17 08:00:00,一级,偏高,短时突升,中,98.0,3.39,0.39,0.38,0.12,0.0,5.83,-0.78,3h同级升5.8℃,,,,否
+4号机,56,4-T003,2025-11-23 20:00:00,一级,偏高,持续偏高,高,105.0,5.0,3.05,4.05,0.06,-0.34,-0.23,-0.06,一级3#缸排气温度较同级中位+4.9℃(平时+0.9℃),较平时+4.1℃,4-T003,2025-11-23 23:00:00,轻微,是
+4号机,56,4-T003,2025-11-24 02:00:00,一级,偏高,持续偏高,高,103.97,5.97,4.01,4.07,1.0,-0.02,-0.97,-0.94,一级3#缸排气温度较同级中位+5.0℃(平时+0.9℃),较平时+4.1℃,4-T003,2025-11-24 08:00:00,轻微,是
+4号机,56,4-T003,2025-11-25 13:00:00,一级,偏高,持续偏高,高,106.0,5.45,3.45,4.0,0.45,0.04,0.03,0.09,一级3#缸排气温度较同级中位+5.0℃(平时+1.0℃),较平时+4.0℃,4-T003,2025-11-26 01:00:00,轻微,是
+4号机,56,4-T003,2025-11-25 15:00:00,一级,偏高,持续偏高,高,107.67,5.14,3.14,4.11,,0.09,0.14,0.26,一级3#缸排气温度较同级中位+5.1℃(平时+1.0℃),较平时+4.1℃,4-T003,2025-11-26 01:00:00,轻微,是
+4号机,56,4-T003,2025-11-26 09:00:00,一级,偏高,持续偏高,高,103.69,5.67,3.67,4.13,0.53,0.16,0.06,0.13,一级3#缸排气温度较同级中位+5.1℃(平时+1.0℃),较平时+4.1℃,,,,否
+4号机,56,4-T006,2026-01-09 15:00:00,一级,偏高,持续偏高,高,103.11,3.18,1.18,4.25,0.07,0.41,0.86,0.09,一级2#缸排气温度较同级中位+3.1℃(平时-1.1℃),较平时+4.3℃,4-T006,2026-01-09 19:00:00,轻微,是
+4号机,56,4-T006,2026-01-09 17:00:00,一级,偏高,持续偏高,高,102.0,3.57,1.57,4.06,0.64,-0.01,-0.24,-0.49,一级2#缸排气温度较同级中位+2.9℃(平时-1.1℃),较平时+4.1℃,4-T006,2026-01-09 19:00:00,轻微,是
 4号机,56,4-T008,2026-01-24 23:00:00,一级,偏高,短时突升,中,101.0,6.71,3.71,2.0,3.71,2.78,4.0,3.34,3h同级升4.0℃,4-T008,2026-01-25 01:00:00,轻微,是
 4号机,56,4-T008,2026-01-25 05:00:00,一级,偏高,持续偏高,高,101.0,7.0,4.0,2.0,4.0,-0.69,0.0,-0.29,级差7.0℃(一级3#缸排气温度-一级1#缸排气温度,平时3.0℃)较平时+4.0℃,,,,否
 4号机,56,4-T008,2026-01-25 08:00:00,一级,偏高,持续偏高,高,101.0,7.0,4.0,2.0,4.0,-0.26,0.0,0.0,级差7.0℃(一级3#缸排气温度-一级1#缸排气温度,平时3.0℃)较平时+4.0℃,,,,否
-4号机,56,4-T008,2026-02-02 12:00:00,二级,混合,混合,中,105.48,9.38,4.56,2.0,10.52,-11.98,-12.25,-12.38,级差9.4℃(二级2#缸排气温度-二级1#缸排气温度,平时4.8℃)较平时+4.6℃;1h同级降12.0℃,,,,否
-4号机,56,4-T008,2026-02-02 15:00:00,二级,偏高,短时突升,中,110.0,4.36,-0.45,0.44,0.1,0.09,11.97,0.22,3h同级升12.0℃,,,,否
-4号机,56,4-T008,2026-02-02 18:00:00,二级,偏高,短时突升,中,106.53,4.49,-0.29,0.12,0.28,-0.1,0.18,12.01,6h同级升12.0℃,,,,否
-4号机,56,4-T009,2026-02-13 06:00:00,一级,偏低,持续偏低,高,99.38,5.98,2.98,0.13,5.33,,,,一级1#缸排气温度较同级中位-5.6℃(平时-0.2℃),较平时-5.3℃,4-T009,2026-02-13 09:00:00,轻微,是
-4号机,56,4-T009,2026-02-14 20:00:00,二级,偏高,短时突升,中,111.38,3.89,-0.9,0.53,0.27,-0.16,6.18,0.33,3h同级升6.2℃,,,,否
-4号机,56,4-T009,2026-02-15 00:00:00,一级,偏高,持续偏高,高,73.9,0.92,-5.07,5.25,0.83,5.23,5.84,5.97,一级1#缸排气温度较同级中位+0.1℃(平时-5.2℃),较平时+5.2℃,,,,否
-4号机,56,4-T011,2026-02-19 12:00:00,二级,混合,混合,中,110.67,9.83,5.75,1.4,11.61,-12.75,-12.95,-12.54,级差9.8℃(二级2#缸排气温度-二级1#缸排气温度,平时4.1℃)较平时+5.8℃;1h同级降12.8℃,,,,否
-4号机,56,4-T011,2026-02-19 15:00:00,二级,偏高,短时突升,中,113.01,4.7,0.62,0.0,0.59,0.4,12.61,0.34,3h同级升12.6℃,,,,否
-4号机,56,4-T011,2026-02-19 18:00:00,二级,偏高,短时突升,中,109.03,4.78,0.65,0.0,0.56,-0.14,-0.04,12.65,6h同级升12.6℃,,,,否
-4号机,56,4-T012,2026-03-02 08:00:00,二级,混合,混合,中,99.25,25.42,20.5,1.99,26.44,-28.46,-28.48,-28.46,级差25.4℃(二级2#缸排气温度-二级1#缸排气温度,平时4.9℃)较平时+20.5℃;二级1#缸排气温度较同级中位-23.4℃(平时+3.0℃),较平时-26.4℃,,,,否
-4号机,56,4-T012,2026-03-02 14:00:00,二级,偏高,短时突升,中,104.47,4.9,-0.03,0.0,0.04,-0.18,0.03,28.34,6h同级升28.3℃,,,,否
-4号机,56,4-T015,2026-04-04 19:00:00,一级,偏低,持续偏低,高,107.62,6.01,3.01,0.48,5.01,,,,一级1#缸排气温度较同级中位-5.3℃(平时-0.2℃),较平时-5.0℃,4-T015,2026-04-05 02:00:00,轻微,是
-4号机,56,4-T015,2026-04-04 21:00:00,一级,偏低,持续偏低,高,106.22,6.15,3.15,0.08,5.56,0.65,,,一级1#缸排气温度较同级中位-5.8℃(平时-0.2℃),较平时-5.6℃,4-T015,2026-04-05 02:00:00,轻微,是
-4号机,56,4-T015,2026-04-04 23:00:00,一级,偏低,持续偏低,高,105.28,5.99,2.99,0.47,5.01,0.24,0.25,,一级1#缸排气温度较同级中位-5.2℃(平时-0.2℃),较平时-5.0℃,4-T015,2026-04-05 02:00:00,轻微,是
-4号机,56,4-T015,2026-04-07 12:00:00,二级,混合,混合,中,114.82,10.33,5.24,2.53,10.69,-12.89,-13.12,-12.89,级差10.3℃(二级2#缸排气温度-二级1#缸排气温度,平时5.1℃)较平时+5.2℃;1h同级降12.9℃,,,,否
-4号机,56,4-T015,2026-04-07 15:00:00,二级,偏高,短时突升,中,119.38,5.33,0.24,0.0,0.19,0.18,13.13,0.13,3h同级升13.1℃,,,,否
-4号机,56,4-T018,2026-05-30 10:00:00,二级,混合,混合,中,120.28,10.53,5.3,2.32,11.12,0.03,-13.31,-13.21,级差10.5℃(二级2#缸排气温度-二级1#缸排气温度,平时5.2℃)较平时+5.3℃;3h同级降13.3℃,,,,否
-4号机,56,4-T018,2026-05-30 11:00:00,二级,混合,短时突升,中,126.2,5.28,0.05,0.07,0.19,13.5,0.11,-0.28,1h同级升13.5℃,,,,否
-4号机,56,4-T018,2026-05-30 13:00:00,二级,偏高,短时突升,中,128.7,5.49,0.49,0.0,0.37,-0.28,13.36,-0.17,3h同级升13.4℃,,,,否
-4号机,56,4-T019,2026-06-06 18:00:00,一级,偏低,持续偏低,高,116.0,6.0,3.0,0.09,5.4,0.64,0.5,0.64,一级1#缸排气温度较同级中位-5.6℃(平时-0.2℃),较平时-5.4℃,4-T019,2026-06-07 00:00:00,轻微,是
-4号机,56,4-T019,2026-06-09 12:00:00,二级,混合,混合,中,129.16,19.16,13.75,0.0,13.73,-13.7,-13.76,-13.48,级差19.2℃(二级1#缸排气温度-二级3#缸排气温度,平时5.4℃)较平时+13.8℃;二级3#缸排气温度较同级中位-16.3℃(平时-2.6℃),较平时-13.7℃,,,,否
-4号机,56,4-T019,2026-06-09 15:00:00,二级,偏高,短时突升,中,130.9,5.27,-0.14,0.28,,0.05,13.89,0.11,3h同级升13.9℃,,,,否
-4号机,56,4-T019,2026-06-09 18:00:00,二级,偏高,短时突升,中,129.23,5.53,0.12,0.0,0.16,0.19,-0.26,13.57,6h同级升13.6℃,,,,否
-5号机,58,5-T001,2025-01-22 05:00:00,一级,混合,混合,中,89.32,5.65,4.06,0.75,4.9,-4.91,-4.9,-4.88,级差5.6℃(一级2#缸排气温度-一级3#缸排气温度,平时1.6℃)较平时+4.1℃;1h同级降4.9℃,,,,否
-5号机,58,5-T001,2025-01-22 08:00:00,一级,偏高,短时突升,中,89.69,0.76,-0.83,0.73,,0.03,4.92,-0.01,3h同级升4.9℃,,,,否
-5号机,58,5-T004,2025-03-11 10:00:00,二级,混合,混合,中,111.4,13.05,11.69,0.74,11.59,0.01,-12.3,-12.3,级差13.1℃(二级2#缸排气温度-二级3#缸排气温度,平时1.4℃)较平时+11.7℃;3h同级降12.3℃,,,,否
-5号机,58,5-T004,2025-03-11 11:00:00,二级,混合,短时突升,中,113.51,1.48,0.11,0.13,,12.2,0.01,-0.12,1h同级升12.2℃,,,,否
-5号机,58,5-T004,2025-03-11 13:00:00,二级,偏高,短时突升,中,119.52,1.43,0.07,0.09,,0.03,12.19,0.08,3h同级升12.2℃,,,,否
-5号机,58,5-T004,2025-03-11 16:00:00,二级,偏高,短时突升,中,122.98,1.36,-0.01,0.16,,-0.05,0.07,12.06,6h同级升12.1℃,,,,否
-5号机,58,5-T007,2025-05-27 12:00:00,一级,混合,混合,中,111.21,12.87,11.39,0.87,11.34,-12.33,-12.41,-12.57,级差12.9℃(一级3#缸排气温度-一级2#缸排气温度,平时1.5℃)较平时+11.4℃;1h同级降12.3℃,,,,否
-5号机,58,5-T007,2025-05-27 15:00:00,一级,偏高,短时突升,中,112.14,1.46,-0.02,0.0,0.09,0.02,12.21,0.2,3h同级升12.2℃,,,,否
-5号机,58,5-T007,2025-05-27 17:00:00,二级,混合,混合,中,124.14,7.95,6.82,0.09,6.73,0.02,-6.86,-6.79,级差8.0℃(二级2#缸排气温度-二级1#缸排气温度,平时1.1℃)较平时+6.8℃;二级1#缸排气温度较同级中位-7.3℃(平时-0.5℃),较平时-6.7℃,,,,否
-5号机,58,5-T007,2025-05-27 18:00:00,一级,偏高,短时突升,中,107.19,1.28,-0.2,0.02,0.2,0.12,-0.11,12.14,6h同级升12.1℃,,,,否
-5号机,58,5-T007,2025-05-27 18:00:00,二级,混合,短时突升,中,123.45,1.13,-0.0,0.1,,6.82,0.01,-0.02,1h同级升6.8℃,,,,否
-5号机,58,5-T007,2025-05-27 20:00:00,二级,偏高,短时突升,中,118.94,1.18,0.05,0.07,,-0.02,6.76,-0.09,3h同级升6.8℃,,,,否
-5号机,58,5-T007,2025-05-27 23:00:00,二级,偏高,短时突升,中,114.12,1.08,-0.05,0.1,,0.02,0.07,6.84,6h同级升6.8℃,,,,否
-5号机,58,5-T007,2025-05-30 11:00:00,一级,混合,混合,中,109.88,55.61,54.15,0.0,54.26,-54.08,-54.2,-54.12,级差55.6℃(一级3#缸排气温度-一级1#缸排气温度,平时1.5℃)较平时+54.2℃;一级1#缸排气温度较同级中位-55.2℃(平时-0.9℃),较平时-54.3℃,,,,否
-5号机,58,5-T007,2025-05-30 17:00:00,一级,偏高,短时突升,中,106.04,1.21,-0.24,0.14,0.05,-0.06,0.08,54.4,6h同级升54.4℃,,,,否
-5号机,58,5-T007,2025-05-31 05:00:00,一级,偏低,短时突降,中,100.56,5.3,3.88,1.03,4.7,-5.62,-5.57,-5.52,1h同级降5.6℃,,,,否
-5号机,58,5-T007,2025-05-31 08:00:00,一级,偏高,短时突升,中,101.67,1.33,-0.09,0.0,0.17,0.01,5.56,0.01,3h同级升5.6℃,,,,否
-5号机,58,5-T008,2025-06-12 10:00:00,一级,混合,混合,中,114.78,12.22,10.6,1.19,11.5,0.01,-12.5,-12.36,级差12.2℃(一级2#缸排气温度-一级3#缸排气温度,平时1.6℃)较平时+10.6℃;3h同级降12.5℃,,,,否
-5号机,58,5-T008,2025-06-12 11:00:00,一级,混合,短时突升,中,116.82,1.67,0.05,0.15,,12.75,0.02,0.31,1h同级升12.8℃,,,,否
-5号机,58,5-T008,2025-06-12 13:00:00,一级,偏高,短时突升,中,118.85,1.42,-0.2,0.38,,0.1,12.5,-0.27,3h同级升12.5℃,,,,否
-5号机,58,5-T008,2025-06-12 16:00:00,一级,偏高,短时突升,中,117.82,1.29,-0.33,0.54,,0.05,0.13,12.36,6h同级升12.4℃,,,,否
-5号机,58,5-T009,2025-07-05 05:00:00,一级,混合,混合,中,106.79,5.66,4.25,1.17,4.91,-5.95,-5.96,-5.64,级差5.7℃(一级2#缸排气温度-一级3#缸排气温度,平时1.4℃)较平时+4.2℃;1h同级降6.0℃,,,,否
-5号机,58,5-T009,2025-07-05 08:00:00,一级,偏高,短时突升,中,111.35,1.71,0.29,0.0,0.35,0.1,5.98,-0.22,3h同级升6.0℃,,,,否
-5号机,58,5-T009,2025-07-05 11:00:00,一级,偏高,短时突升,中,115.19,1.7,0.28,0.0,0.31,0.05,-0.03,6.01,6h同级升6.0℃,,,,否
+4号机,56,4-T009,2026-02-13 06:00:00,一级,偏低,持续偏低,高,99.38,5.98,2.98,0.14,5.43,,,,一级1#缸排气温度较同级中位-5.6℃(平时-0.1℃),较平时-5.4℃,4-T009,2026-02-13 08:00:00,轻微,是
+4号机,56,4-T009,2026-02-13 18:00:00,一级,偏低,持续偏低,高,105.75,5.38,2.38,0.0,5.02,-0.28,-0.15,-0.47,一级1#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.0℃,,,,否
+4号机,56,4-T009,2026-02-13 22:00:00,一级,偏低,持续偏低,高,102.0,5.94,2.94,0.48,5.04,-0.19,-0.11,-0.21,一级1#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.0℃,,,,否
+4号机,56,4-T009,2026-02-15 00:00:00,一级,偏高,持续偏高,高,73.9,0.92,-5.07,5.25,0.83,-0.55,-0.08,-0.04,一级1#缸排气温度较同级中位+0.1℃(平时-5.2℃),较平时+5.2℃,,,,否
+4号机,56,4-T014,2026-03-24 21:00:00,一级,偏低,持续偏低,高,103.97,5.97,2.97,0.49,5.06,-0.18,-0.36,-0.64,一级1#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.1℃,,,,否
+4号机,56,4-T014,2026-03-25 00:00:00,一级,偏低,持续偏低,高,102.0,5.84,2.84,0.38,5.05,-0.2,-0.12,-0.35,一级1#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.1℃,,,,否
+4号机,56,4-T015,2026-04-04 19:00:00,一级,偏低,持续偏低,高,107.62,6.01,3.01,0.5,5.11,,,,一级1#缸排气温度较同级中位-5.3℃(平时-0.1℃),较平时-5.1℃,4-T015,2026-04-05 02:00:00,轻微,是
+4号机,56,4-T015,2026-04-04 21:00:00,一级,偏低,持续偏低,高,106.22,6.15,3.15,0.09,5.66,-0.15,,,一级1#缸排气温度较同级中位-5.8℃(平时-0.1℃),较平时-5.7℃,4-T015,2026-04-05 02:00:00,轻微,是
+4号机,56,4-T015,2026-04-04 23:00:00,一级,偏低,持续偏低,高,105.28,5.99,2.99,0.48,5.1,-0.01,-0.01,,一级1#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.1℃,4-T015,2026-04-05 02:00:00,轻微,是
 5号机,58,5-T009,2025-07-13 11:00:00,一级,偏低,短时突降,中,62.84,1.36,-0.16,1.33,0.53,,-4.46,-4.53,3h同级降4.5℃,,,,否
 5号机,58,5-T009,2025-07-13 12:00:00,一级,偏低,短时突降,中,56.78,1.07,-0.45,1.33,0.47,-0.23,-4.69,-4.8,3h同级降4.7℃,,,,否
-5号机,58,5-T012,2025-08-26 12:00:00,一级,混合,混合,中,111.7,13.41,11.82,0.99,12.42,-12.38,-12.31,-12.35,级差13.4℃(一级3#缸排气温度-一级2#缸排气温度,平时1.6℃)较平时+11.8℃;一级2#缸排气温度较同级中位-12.4℃(平时+0.0℃),较平时-12.4℃,,,,否
-5号机,58,5-T012,2025-08-26 15:00:00,一级,偏高,短时突升,中,111.07,0.99,-0.6,0.96,0.03,0.03,12.39,-0.08,3h同级升12.4℃,,,,否
-5号机,58,5-T012,2025-08-26 18:00:00,一级,偏高,短时突升,中,110.52,1.04,-0.55,0.96,0.08,0.05,-0.05,12.35,6h同级升12.3℃,,,,否
-5号机,58,5-T012,2025-08-30 12:00:00,一级,混合,混合,中,110.96,13.33,12.01,0.04,12.21,-12.19,-12.2,-12.19,级差13.3℃(一级3#缸排气温度-一级1#缸排气温度,平时1.3℃)较平时+12.0℃;一级1#缸排气温度较同级中位-12.2℃(平时+0.0℃),较平时-12.2℃,,,,否
-5号机,58,5-T012,2025-08-30 14:00:00,一级,混合,混合,中,111.28,32.03,30.71,0.18,30.6,0.03,-30.58,-30.61,级差32.0℃(一级3#缸排气温度-一级1#缸排气温度,平时1.3℃)较平时+30.7℃;一级1#缸排气温度较同级中位-30.6℃(平时+0.0℃),较平时-30.6℃,,,,否
-5号机,58,5-T018,2025-11-18 02:00:00,一级,偏高,持续偏高,高,100.36,8.51,4.91,5.14,,1.43,4.06,4.5,一级3#缸排气温度较同级中位+6.6℃(平时+1.5℃),较平时+5.1℃,5-T018,2025-11-18 04:00:00,严重,是
-5号机,58,5-T019,2025-11-30 10:00:00,二级,混合,混合,中,120.36,14.88,13.71,0.92,12.78,0.02,-12.68,-12.71,级差14.9℃(二级3#缸排气温度-二级1#缸排气温度,平时1.2℃)较平时+13.7℃;二级1#缸排气温度较同级中位-13.1℃(平时-0.3℃),较平时-12.8℃,,,,否
-5号机,58,5-T019,2025-11-30 11:00:00,二级,混合,短时突升,中,125.45,1.99,0.82,0.81,,12.78,0.01,-0.17,1h同级升12.8℃,,,,否
-5号机,58,5-T021,2025-12-22 12:00:00,二级,混合,混合,中,106.86,13.33,11.82,0.15,11.7,-11.72,-11.66,-11.64,级差13.3℃(二级2#缸排气温度-二级1#缸排气温度,平时1.5℃)较平时+11.8℃;1h同级降11.7℃,5-T021,2025-12-22 17:00:00,轻微,是
-5号机,58,5-T021,2025-12-22 15:00:00,二级,混合,混合,中,105.97,0.71,-0.79,0.36,,0.0,5.82,0.01,3h同级升5.8℃;3h同级降5.8℃,5-T021,2025-12-22 17:00:00,轻微,是
-5号机,58,5-T021,2025-12-22 20:00:00,二级,偏高,短时突升,中,104.67,1.72,0.21,0.15,0.09,-0.03,5.89,0.01,3h同级升5.9℃,,,,否
-5号机,58,5-T024,2026-01-15 05:00:00,二级,偏低,短时突降,中,103.03,4.81,3.3,0.69,4.94,-5.64,-5.61,-5.59,1h同级降5.6℃,,,,否
-5号机,58,5-T024,2026-01-15 08:00:00,二级,偏高,短时突升,中,103.64,1.47,-0.04,0.0,0.08,0.03,5.55,-0.04,3h同级升5.6℃,,,,否
-5号机,58,5-T025,2026-02-07 10:00:00,二级,混合,混合,中,107.7,12.81,11.26,0.95,11.03,0.0,-11.8,-11.74,级差12.8℃(二级2#缸排气温度-二级3#缸排气温度,平时1.6℃)较平时+11.3℃;3h同级降11.8℃,,,,否
-5号机,58,5-T025,2026-02-07 11:00:00,二级,混合,短时突升,中,108.31,1.83,0.28,0.16,0.11,11.83,0.01,0.04,1h同级升11.8℃,,,,否
-5号机,58,5-T025,2026-02-07 13:00:00,二级,偏高,短时突升,中,109.13,1.86,0.31,0.14,0.15,-0.02,11.85,-0.07,3h同级升11.8℃,,,,否
-5号机,58,5-T025,2026-02-07 16:00:00,二级,偏高,短时突升,中,109.28,1.79,0.23,0.13,0.09,-0.04,0.07,11.85,6h同级升11.9℃,,,,否
-5号机,58,5-T025,2026-02-10 12:00:00,二级,混合,混合,中,110.93,11.52,9.82,0.77,11.71,-12.49,-12.4,-12.45,级差11.5℃(二级3#缸排气温度-二级2#缸排气温度,平时1.7℃)较平时+9.8℃;1h同级降12.5℃,,,,否
-5号机,58,5-T025,2026-02-10 15:00:00,二级,偏高,短时突升,中,116.51,1.7,-0.0,0.27,,0.01,12.5,-0.31,3h同级升12.5℃,,,,否
-5号机,58,5-T025,2026-02-10 18:00:00,二级,偏高,短时突升,中,112.09,1.8,0.09,0.16,,-0.07,0.1,12.59,6h同级升12.6℃,,,,否
-5号机,58,5-T029,2026-03-30 23:00:00,一级,偏高,持续偏高,高,99.76,8.03,3.38,4.04,0.02,0.05,-0.01,0.11,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
-5号机,58,5-T029,2026-03-31 01:00:00,一级,偏高,持续偏高,高,99.53,8.05,3.39,4.03,0.01,0.07,0.08,0.05,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
-5号机,58,5-T029,2026-03-31 06:00:00,一级,偏高,持续偏高,高,99.38,8.06,3.35,4.0,0.03,-0.07,0.03,0.07,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
+5号机,58,5-T018,2025-11-18 02:00:00,一级,偏高,持续偏高,高,100.36,8.51,4.91,5.14,,1.43,4.06,4.5,一级3#缸排气温度较同级中位+6.6℃(平时+1.5℃),较平时+5.1℃,5-T018,2025-11-18 04:00:00,严重异常,是
+5号机,58,5-T029,2026-03-30 23:00:00,一级,偏高,持续偏高,高,99.76,8.03,3.38,4.04,0.02,-0.03,-0.01,-0.06,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
+5号机,58,5-T029,2026-03-31 01:00:00,一级,偏高,持续偏高,高,99.53,8.05,3.39,4.03,0.01,-0.02,-0.0,-0.02,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
+5号机,58,5-T029,2026-03-31 06:00:00,一级,偏高,持续偏高,高,99.38,8.06,3.35,4.0,0.03,-0.07,-0.02,-0.0,一级2#缸排气温度较同级中位+8.0℃(平时+4.0℃),较平时+4.0℃,,,,否
 5号机,58,5-T030,2026-04-08 09:00:00,一级,偏高,持续偏高,高,104.81,10.56,9.73,10.02,0.32,6.99,9.26,9.4,一级2#缸排气温度较同级中位+10.2℃(平时+0.2℃),较平时+10.0℃,,,,否
-5号机,58,5-T033,2026-05-02 10:00:00,一级,混合,混合,中,99.64,11.03,10.11,0.91,10.0,0.03,-10.91,-10.87,级差11.0℃(一级2#缸排气温度-一级3#缸排气温度,平时0.9℃)较平时+10.1℃;一级3#缸排气温度较同级中位-10.0℃(平时+0.0℃),较平时-10.0℃,,,,否
-5号机,58,5-T033,2026-05-02 11:00:00,一级,混合,短时突升,中,101.36,1.14,0.22,0.0,0.23,10.94,0.09,-0.1,1h同级升10.9℃,,,,否
-5号机,58,5-T033,2026-05-02 13:00:00,一级,偏高,短时突升,中,103.19,1.13,0.19,0.0,0.28,0.02,11.01,0.1,3h同级升11.0℃,,,,否
-5号机,58,5-T033,2026-05-02 16:00:00,一级,偏高,短时突升,中,102.66,0.97,0.03,0.06,0.11,0.1,0.14,10.97,6h同级升11.0℃,,,,否
-6号机,59,6-T005,2025-02-08 16:00:00,一级,偏低,短时突降,中,47.44,3.45,2.14,2.02,1.44,,-16.0,1.29,3h同级降16.0℃,,,,否
-6号机,59,6-T006,2025-02-27 05:00:00,二级,偏低,持续偏低,高,96.63,4.69,3.77,0.25,5.13,-5.33,-5.31,-5.24,二级2#缸排气温度较同级中位-4.5℃(平时+0.7℃),较平时-5.1℃,,,,否
-6号机,59,6-T006,2025-02-27 08:00:00,二级,偏高,短时突升,中,97.65,0.95,0.03,0.0,0.02,0.0,5.37,-0.06,3h同级升5.4℃,,,,否
-6号机,59,6-T006,2025-03-02 05:00:00,二级,混合,混合,中,106.18,6.57,5.7,0.26,5.68,-5.89,-5.9,-5.77,级差6.6℃(二级2#缸排气温度-二级1#缸排气温度,平时0.9℃)较平时+5.7℃;二级1#缸排气温度较同级中位-5.7℃(平时+0.0℃),较平时-5.7℃,,,,否
-6号机,59,6-T006,2025-03-02 08:00:00,二级,偏高,短时突升,中,107.9,0.88,0.01,0.0,0.01,0.01,5.93,0.03,3h同级升5.9℃,,,,否
-6号机,59,6-T015,2025-09-08 17:00:00,二级,混合,混合,中,124.95,6.75,6.06,0.56,6.42,0.0,-6.87,-6.98,级差6.8℃(二级1#缸排气温度-二级2#缸排气温度,平时0.7℃)较平时+6.1℃;二级2#缸排气温度较同级中位-6.2℃(平时+0.2℃),较平时-6.4℃,,,,否
-6号机,59,6-T015,2025-09-08 18:00:00,二级,混合,短时突升,中,122.79,0.77,0.08,0.0,0.14,6.91,0.01,0.12,1h同级升6.9℃,,,,否
-6号机,59,6-T015,2025-09-08 20:00:00,二级,偏高,短时突升,中,119.44,0.59,-0.11,0.16,,0.06,6.78,0.22,3h同级升6.8℃,,,,否
-6号机,59,6-T015,2025-09-08 23:00:00,二级,偏高,短时突升,中,117.28,0.74,0.05,0.03,0.03,-0.04,-0.15,6.94,6h同级升6.9℃,,,,否
-6号机,59,6-T017,2025-10-14 17:00:00,一级,混合,混合,中,103.38,5.83,5.01,0.86,4.94,0.04,-5.8,-5.8,级差5.8℃(一级1#缸排气温度-一级2#缸排气温度,平时0.8℃)较平时+5.0℃;3h同级降5.8℃,,,,否
-6号机,59,6-T017,2025-10-14 18:00:00,一级,混合,短时突升,中,102.23,0.85,0.03,0.0,0.06,5.78,0.03,0.04,1h同级升5.8℃,,,,否
-6号机,59,6-T017,2025-10-14 20:00:00,一级,偏高,短时突升,中,101.52,0.84,0.01,0.01,0.02,-0.02,5.74,0.1,3h同级升5.7℃,,,,否
-6号机,59,6-T017,2025-10-16 05:00:00,二级,混合,混合,中,112.21,6.56,5.66,0.53,5.71,-6.16,-6.2,-6.23,级差6.6℃(二级2#缸排气温度-二级1#缸排气温度,平时0.9℃)较平时+5.7℃;1h同级降6.2℃,,,,否
-6号机,59,6-T017,2025-10-16 08:00:00,二级,偏高,短时突升,中,112.4,0.9,0.01,0.0,0.02,0.03,6.18,0.02,3h同级升6.2℃,,,,否
-6号机,59,6-T017,2025-10-16 11:00:00,二级,偏高,短时突升,中,114.84,0.91,0.01,0.0,0.07,-0.07,0.05,6.24,6h同级升6.2℃,,,,否
-6号机,59,6-T017,2025-10-20 12:00:00,一级,混合,混合,中,98.18,10.93,10.1,0.77,10.23,-10.9,-10.86,-10.89,级差10.9℃(一级2#缸排气温度-一级1#缸排气温度,平时0.8℃)较平时+10.1℃;1h同级降10.9℃,,,,否
-6号机,59,6-T017,2025-10-20 15:00:00,一级,偏高,短时突升,中,98.02,0.81,-0.01,0.02,0.05,0.05,10.91,-0.06,3h同级升10.9℃,,,,否
-6号机,59,6-T017,2025-10-20 18:00:00,一级,偏高,短时突升,中,97.36,0.83,0.01,0.05,0.05,-0.02,0.02,10.88,6h同级升10.9℃,,,,否
-6号机,59,6-T017,2025-10-23 12:00:00,一级,混合,混合,中,102.5,12.6,11.78,1.81,11.54,-11.21,-11.27,-11.24,级差12.6℃(一级3#缸排气温度-一级2#缸排气温度,平时0.8℃)较平时+11.8℃;1h同级降11.2℃,,,,否
-6号机,59,6-T017,2025-10-23 15:00:00,一级,偏高,短时突升,中,103.28,1.44,0.62,1.83,0.35,0.01,11.16,-0.08,3h同级升11.2℃,,,,否
-6号机,59,6-T017,2025-10-23 18:00:00,一级,偏高,短时突升,中,101.24,1.43,0.61,1.89,0.28,0.06,-0.07,11.17,6h同级升11.2℃,,,,否
-6号机,59,6-T018,2025-10-30 13:00:00,一级,偏低,短时突降,中,108.45,1.66,0.24,0.17,0.09,-0.01,-11.51,0.17,3h同级降11.5℃,,,,否
-6号机,59,6-T018,2025-10-30 16:00:00,一级,偏低,短时突降,中,105.94,1.59,0.17,0.13,0.07,-0.02,-0.05,-11.49,6h同级降11.5℃,,,,否
-6号机,59,6-T018,2025-11-07 10:00:00,二级,混合,混合,中,110.92,12.51,11.88,0.55,11.81,0.0,-12.25,-12.25,级差12.5℃(二级2#缸排气温度-二级1#缸排气温度,平时0.6℃)较平时+11.9℃;3h同级降12.3℃,,,,否
-6号机,59,6-T018,2025-11-07 11:00:00,二级,混合,短时突升,中,111.2,0.69,0.07,0.07,0.04,12.26,0.06,0.23,1h同级升12.3℃,,,,否
-6号机,59,6-T018,2025-11-07 13:00:00,二级,偏高,短时突升,中,110.98,0.65,0.03,0.11,,-0.06,12.17,0.18,3h同级升12.2℃,,,,否
-6号机,59,6-T018,2025-11-07 16:00:00,二级,偏高,短时突升,中,111.25,0.47,-0.15,0.0,0.14,-0.02,-0.18,12.23,6h同级升12.2℃,,,,否
-6号机,59,6-T022,2025-12-16 17:00:00,二级,混合,混合,中,118.37,7.55,6.52,0.0,6.6,0.03,-6.56,-6.64,级差7.5℃(二级2#缸排气温度-二级3#缸排气温度,平时1.0℃)较平时+6.5℃;二级3#缸排气温度较同级中位-7.3℃(平时-0.7℃),较平时-6.6℃,,,,否
-6号机,59,6-T022,2025-12-16 18:00:00,二级,混合,短时突升,中,116.64,0.99,-0.04,0.0,0.06,6.56,0.06,-0.07,1h同级升6.6℃,,,,否
-6号机,59,6-T022,2025-12-16 20:00:00,二级,偏高,短时突升,中,113.69,0.92,-0.11,0.03,0.07,0.03,6.63,-0.06,3h同级升6.6℃,,,,否
-6号机,59,6-T022,2025-12-16 23:00:00,二级,偏高,短时突升,中,111.23,0.93,-0.09,0.06,0.01,-0.06,-0.04,6.62,6h同级升6.6℃,,,,否
-6号机,59,6-T024,2026-01-09 05:00:00,一级,偏低,短时突降,中,88.08,3.98,1.47,3.14,1.9,-4.7,-4.33,-4.02,1h同级降4.7℃,,,,否
-6号机,59,6-T025,2026-01-19 12:00:00,一级,混合,短时突升,中,98.7,8.47,2.8,0.27,3.35,3.35,5.08,5.51,3h同级升5.1℃,,,,否
-6号机,59,6-T025,2026-01-19 13:00:00,一级,混合,混合,中,99.57,8.71,3.03,0.11,5.11,1.59,5.46,7.39,3h同级升5.5℃;一级2#缸排气温度较同级中位-5.2℃(平时-0.1℃),较平时-5.1℃,,,,否
-6号机,59,6-T025,2026-01-19 14:00:00,一级,混合,混合,中,98.72,8.61,2.93,0.0,5.77,0.73,5.91,8.12,3h同级升5.9℃;一级2#缸排气温度较同级中位-6.0℃(平时-0.2℃),较平时-5.8℃,,,,否
-6号机,59,6-T025,2026-01-19 15:00:00,一级,混合,混合,中,99.81,10.93,5.25,2.78,7.93,4.96,7.52,12.6,3h同级升7.5℃;一级2#缸排气温度较同级中位-8.2℃(平时-0.2℃),较平时-7.9℃,,,,否
-6号机,59,6-T025,2026-01-19 16:00:00,一级,混合,混合,中,99.12,10.95,5.27,2.9,7.81,-0.1,5.71,11.17,6h同级升11.2℃;一级2#缸排气温度较同级中位-8.1℃(平时-0.2℃),较平时-7.8℃,,,,否
-6号机,59,6-T025,2026-01-19 17:00:00,一级,混合,混合,中,98.8,10.83,5.14,3.21,7.13,-0.31,4.86,10.77,6h同级升10.8℃;一级2#缸排气温度较同级中位-7.6℃(平时-0.5℃),较平时-7.1℃,,,,否
-6号机,59,6-T025,2026-01-19 18:00:00,一级,混合,混合,中,100.35,12.74,7.04,5.49,6.51,1.91,1.81,9.33,6h同级升9.3℃;一级2#缸排气温度较同级中位-7.2℃(平时-0.7℃),较平时-6.5℃,,,,否
-6号机,59,6-T025,2026-01-19 19:00:00,一级,混合,混合,中,99.1,14.78,9.07,7.96,6.08,2.04,3.83,9.54,一级1#缸排气温度较同级中位+8.0℃(平时+0.0℃),较平时+8.0℃;一级2#缸排气温度较同级中位-6.8℃(平时-0.7℃),较平时-6.1℃,,,,否
-6号机,59,6-T027,2026-02-11 05:00:00,一级,混合,混合,中,95.48,12.3,4.99,0.15,4.85,-4.88,-4.94,-4.89,级差12.3℃(一级3#缸排气温度-一级2#缸排气温度,平时7.3℃)较平时+5.0℃;1h同级降4.9℃,,,,否
-6号机,59,6-T027,2026-02-11 08:00:00,一级,偏高,短时突升,中,95.78,7.44,0.13,0.16,,0.0,4.86,-0.07,3h同级升4.9℃,,,,否
-6号机,59,6-T027,2026-02-16 17:00:00,一级,混合,混合,中,99.13,12.13,4.94,0.0,7.15,0.09,-4.72,-4.83,级差12.1℃(一级3#缸排气温度-一级2#缸排气温度,平时7.2℃)较平时+4.9℃;一级2#缸排气温度较同级中位-9.2℃(平时-2.1℃),较平时-7.2℃,,,,否
-6号机,59,6-T027,2026-02-16 18:00:00,一级,混合,短时突升,中,96.91,6.96,-0.23,0.0,2.25,5.0,0.24,-0.38,1h同级升5.0℃,,,,否
-6号机,59,6-T027,2026-02-16 20:00:00,一级,偏高,短时突升,中,95.45,6.86,-0.32,0.0,2.17,0.09,5.14,-0.53,3h同级升5.1℃,,,,否
-6号机,59,6-T028,2026-02-25 10:00:00,二级,混合,混合,中,103.15,12.27,11.32,0.0,11.38,0.02,-11.29,-11.37,级差12.3℃(二级1#缸排气温度-二级3#缸排气温度,平时0.9℃)较平时+11.3℃;3h同级降11.3℃,,,,否
-6号机,59,6-T028,2026-02-25 11:00:00,二级,混合,短时突升,中,103.45,0.93,-0.02,0.0,0.03,11.35,0.01,0.04,1h同级升11.3℃,,,,否
-6号机,59,6-T028,2026-02-25 13:00:00,二级,偏高,短时突升,中,104.64,0.95,0.0,0.0,0.04,-0.03,11.33,-0.05,3h同级升11.3℃,,,,否
-6号机,59,6-T028,2026-02-25 16:00:00,二级,偏高,短时突升,中,105.21,0.97,0.03,0.0,0.1,0.01,0.03,11.28,6h同级升11.3℃,,,,否
+6号机,59,6-T005,2025-02-08 16:00:00,一级,偏低,短时突降,中,47.44,3.45,2.15,2.02,1.44,,-16.0,-0.83,3h同级降16.0℃,,,,否
+6号机,59,6-T025,2026-01-19 12:00:00,一级,混合,短时突升,中,98.7,8.47,2.8,0.28,3.28,3.35,5.08,5.51,3h同级升5.1℃,,,,否
+6号机,59,6-T025,2026-01-19 13:00:00,一级,混合,混合,中,99.57,8.71,3.03,0.0,5.04,1.59,5.46,7.39,3h同级升5.5℃;一级2#缸排气温度较同级中位-5.2℃(平时-0.2℃),较平时-5.0℃,,,,否
+6号机,59,6-T025,2026-01-19 14:00:00,一级,混合,混合,中,98.72,8.61,2.93,0.0,5.75,0.73,5.91,8.12,3h同级升5.9℃;一级2#缸排气温度较同级中位-6.0℃(平时-0.2℃),较平时-5.8℃,,,,否
+6号机,59,6-T025,2026-01-19 15:00:00,一级,混合,混合,中,99.81,10.93,5.25,2.78,7.91,4.96,7.52,12.6,3h同级升7.5℃;一级2#缸排气温度较同级中位-8.2℃(平时-0.2℃),较平时-7.9℃,,,,否
+6号机,59,6-T025,2026-01-19 16:00:00,一级,混合,混合,中,99.12,10.95,5.27,2.9,7.57,-0.1,5.71,11.17,6h同级升11.2℃;一级2#缸排气温度较同级中位-8.1℃(平时-0.5℃),较平时-7.6℃,,,,否
+6号机,59,6-T025,2026-01-19 17:00:00,一级,混合,混合,中,98.8,10.83,5.15,3.21,6.89,-0.31,4.86,10.77,6h同级升10.8℃;一级2#缸排气温度较同级中位-7.6℃(平时-0.7℃),较平时-6.9℃,,,,否
+6号机,59,6-T025,2026-01-19 18:00:00,一级,混合,混合,中,100.35,12.74,7.05,5.49,6.51,1.91,1.81,9.33,6h同级升9.3℃;一级2#缸排气温度较同级中位-7.2℃(平时-0.7℃),较平时-6.5℃,,,,否
+6号机,59,6-T025,2026-01-19 19:00:00,一级,混合,混合,中,99.1,14.78,9.08,7.96,6.08,2.04,3.83,9.54,一级1#缸排气温度较同级中位+8.0℃(平时+0.0℃),较平时+8.0℃;一级2#缸排气温度较同级中位-6.8℃(平时-0.7℃),较平时-6.1℃,,,,否
 6号机,59,6-T028,2026-02-27 09:00:00,一级,偏高,持续偏高,高,102.87,12.29,4.25,4.28,,1.15,0.96,0.97,一级3#缸排气温度较同级中位+11.3℃(平时+7.1℃),较平时+4.3℃,,,,否
-6号机,59,6-T030,2026-04-12 17:00:00,一级,混合,混合,中,101.76,6.18,4.93,0.59,4.91,0.02,-5.53,-5.64,级差6.2℃(一级2#缸排气温度-一级3#缸排气温度,平时1.2℃)较平时+4.9℃;3h同级降5.5℃,,,,否
-6号机,59,6-T030,2026-04-12 18:00:00,一级,混合,短时突升,中,100.86,1.27,0.03,0.0,0.19,5.67,0.02,-0.06,1h同级升5.7℃,,,,否
-6号机,59,6-T030,2026-04-12 20:00:00,一级,偏高,短时突升,中,98.61,1.26,0.01,0.0,0.13,-0.05,5.61,0.08,3h同级升5.6℃,,,,否
-6号机,59,6-T032,2026-05-17 20:00:00,一级,偏高,短时突升,中,100.79,1.46,0.03,0.0,0.09,0.04,5.6,-0.07,3h同级升5.6℃,,,,否
-6号机,59,6-T032,2026-05-20 12:00:00,二级,混合,混合,中,129.23,15.13,14.26,0.06,14.23,-14.29,-14.16,-14.22,级差15.1℃(二级1#缸排气温度-二级3#缸排气温度,平时0.9℃)较平时+14.3℃;二级3#缸排气温度较同级中位-14.7℃(平时-0.5℃),较平时-14.2℃,,,,否
-6号机,59,6-T032,2026-05-20 15:00:00,二级,偏高,短时突升,中,127.92,0.72,-0.15,0.08,0.05,0.01,14.31,-0.11,3h同级升14.3℃,,,,否
-6号机,59,6-T032,2026-05-20 18:00:00,二级,偏高,短时突升,中,125.32,0.88,0.01,0.02,0.01,0.03,-0.09,14.22,6h同级升14.2℃,,,,否
-6号机,59,6-T032,2026-05-25 12:00:00,一级,混合,混合,中,102.02,10.22,8.72,0.26,11.25,-11.49,-11.51,-11.4,级差10.2℃(一级3#缸排气温度-一级2#缸排气温度,平时1.5℃)较平时+8.7℃;1h同级降11.5℃,,,,否
-6号机,59,6-T032,2026-05-25 15:00:00,一级,偏高,短时突升,中,103.16,1.55,0.05,0.05,0.02,0.01,11.52,-0.03,3h同级升11.5℃,,,,否
-6号机,59,6-T032,2026-05-25 18:00:00,一级,偏高,短时突升,中,102.37,1.52,0.02,0.12,,0.02,-0.07,11.49,6h同级升11.5℃,,,,否
-6号机,59,6-T033,2026-06-22 17:00:00,二级,混合,混合,中,125.73,7.36,6.52,0.9,6.66,0.0,-6.98,0.09,级差7.4℃(二级1#缸排气温度-二级2#缸排气温度,平时0.8℃)较平时+6.5℃;二级2#缸排气温度较同级中位-6.5℃(平时+0.2℃),较平时-6.7℃,,,,否
-6号机,59,6-T033,2026-06-22 18:00:00,二级,混合,短时突升,中,124.06,0.92,0.07,0.35,0.2,7.01,0.05,0.09,1h同级升7.0℃,,,,否
-6号机,59,6-T033,2026-06-22 20:00:00,二级,偏高,短时突升,中,120.94,0.75,-0.1,0.22,0.2,0.08,6.98,0.0,3h同级升7.0℃,,,,否
-6号机,59,6-T033,2026-06-22 23:00:00,二级,偏高,短时突升,中,119.44,0.84,0.15,0.23,0.2,0.0,-0.09,7.08,6h同级升7.1℃,,,,否
-6号机,59,6-T033,2026-06-23 10:00:00,一级,混合,混合,中,108.85,10.88,9.52,0.1,12.06,0.03,-12.17,-12.14,级差10.9℃(一级3#缸排气温度-一级2#缸排气温度,平时1.4℃)较平时+9.5℃;一级2#缸排气温度较同级中位-10.8℃(平时+1.3℃),较平时-12.1℃,,,,否
-6号机,59,6-T033,2026-06-23 11:00:00,一级,混合,短时突升,中,111.38,1.27,-0.09,0.02,0.06,12.07,0.02,0.1,1h同级升12.1℃,,,,否
-6号机,59,6-T033,2026-06-23 13:00:00,一级,偏高,短时突升,中,111.93,1.24,-0.13,0.06,0.05,-0.01,12.04,-0.08,3h同级升12.0℃,,,,否
-6号机,59,6-T033,2026-06-23 16:00:00,一级,偏高,短时突升,中,110.43,1.25,-0.11,0.08,0.0,0.02,-0.04,12.05,6h同级升12.0℃,,,,否
-7号机,47,7-T021,2025-01-06 12:00:00,一级,混合,混合,中,84.77,10.66,9.03,0.45,9.16,-9.46,-9.33,-9.43,级差10.7℃(一级2列缸排气温度-一级4列缸排气温度,平时1.6℃)较平时+9.0℃;1h同级降9.5℃,,,,否
-7号机,47,7-T021,2025-01-06 15:00:00,一级,偏高,短时突升,中,86.14,1.43,-0.2,0.39,,0.01,9.22,-0.11,3h同级升9.2℃,,,,否
-7号机,47,7-T022,2025-01-26 05:00:00,二级,偏高,持续偏高,高,82.89,4.97,4.56,2.28,2.28,2.32,2.32,2.3,级差5.0℃(二级3列缸排气温度-二级5列缸排气温度,平时0.4℃)较平时+4.6℃,,,,否
-7号机,47,7-T022,2025-01-29 05:00:00,二级,偏高,持续偏高,高,83.76,4.9,4.51,2.26,2.26,2.3,2.3,2.32,级差4.9℃(二级3列缸排气温度-二级5列缸排气温度,平时0.4℃)较平时+4.5℃,,,,否
-7号机,47,7-T022,2025-02-01 12:00:00,二级,偏高,持续偏高,高,81.25,9.19,8.83,4.41,4.42,,,,级差9.2℃(二级3列缸排气温度-二级5列缸排气温度,平时0.4℃)较平时+8.8℃,,,,否
-7号机,47,7-T022,2025-02-01 15:00:00,二级,混合,混合,中,82.19,0.3,-0.06,0.03,0.03,0.0,4.44,0.0,3h同级升4.4℃;3h同级降4.4℃,,,,否
-7号机,47,7-T022,2025-02-03 10:00:00,一级,混合,混合,中,83.41,10.87,9.18,0.27,8.93,0.04,-8.63,,级差10.9℃(一级2列缸排气温度-一级6列缸排气温度,平时1.7℃)较平时+9.2℃;一级6列缸排气温度较同级中位-9.4℃(平时-0.4℃),较平时-8.9℃,,,,否
-7号机,47,7-T022,2025-02-03 11:00:00,一级,混合,短时突升,中,84.01,1.7,0.01,0.33,,9.16,0.21,-0.4,1h同级升9.2℃,,,,否
-7号机,47,7-T022,2025-02-03 13:00:00,一级,偏高,短时突升,中,84.72,1.72,0.03,0.16,,-0.02,9.03,-0.4,3h同级升9.0℃,,,,否
-7号机,47,7-T022,2025-02-03 16:00:00,一级,偏高,短时突升,中,84.74,1.76,0.07,0.05,0.05,0.13,0.1,8.89,6h同级升8.9℃,,,,否
-7号机,47,7-T022,2025-02-07 12:00:00,一级,混合,混合,中,81.97,10.73,9.02,0.0,9.05,-8.89,-8.72,-8.87,级差10.7℃(一级2列缸排气温度-一级6列缸排气温度,平时1.7℃)较平时+9.0℃;一级6列缸排气温度较同级中位-9.5℃(平时-0.4℃),较平时-9.1℃,,,,否
-7号机,47,7-T022,2025-02-07 15:00:00,一级,偏高,短时突升,中,82.21,1.73,0.01,0.0,0.14,0.08,8.91,-0.17,3h同级升8.9℃,,,,否
-7号机,47,7-T022,2025-02-07 18:00:00,一级,偏高,短时突升,中,81.69,1.88,0.17,0.07,0.13,-0.04,0.16,8.85,6h同级升8.8℃,,,,否
-7号机,47,7-T025,2025-03-23 05:00:00,一级,偏低,短时突降,中,85.25,3.76,2.11,0.45,4.57,-4.7,-4.97,-4.81,1h同级降4.7℃,,,,否
-7号机,47,7-T025,2025-03-23 08:00:00,一级,偏高,短时突升,中,86.38,1.31,-0.34,0.08,0.25,0.02,4.69,-0.28,3h同级升4.7℃,,,,否
-7号机,47,7-T025,2025-03-31 05:00:00,一级,偏低,短时突降,中,83.59,5.4,3.79,0.42,4.08,-4.47,-4.29,-4.08,1h同级降4.5℃,,,,否
-7号机,47,7-T025,2025-03-31 08:00:00,一级,偏高,短时突升,中,84.49,1.26,-0.35,0.16,0.18,0.11,4.35,-0.07,3h同级升4.3℃,,,,否
-7号机,30,7-T001,2025-04-15 17:00:00,一级,混合,混合,中,100.8,7.2,5.61,0.26,5.35,0.08,-5.41,-5.4,级差7.2℃(一级2列缸排气温度-一级6列缸排气温度,平时1.6℃)较平时+5.6℃;一级6列缸排气温度较同级中位-5.8℃(平时-0.5℃),较平时-5.3℃,,,,否
-7号机,30,7-T001,2025-04-15 18:00:00,一级,混合,短时突升,中,99.8,1.53,-0.07,0.15,,5.49,0.02,0.03,1h同级升5.5℃,,,,否
-7号机,30,7-T001,2025-04-15 20:00:00,一级,偏高,短时突升,中,97.93,1.5,-0.1,0.14,,-0.04,5.48,0.08,3h同级升5.5℃,,,,否
-7号机,30,7-T002,2025-04-24 19:00:00,二级,混合,混合,中,98.49,16.31,16.17,8.1,8.1,,,,级差16.3℃(二级3列缸排气温度-二级5列缸排气温度,平时0.1℃)较平时+16.2℃;二级5列缸排气温度较同级中位-8.2℃(平时-0.1℃),较平时-8.1℃,,,,否
-7号机,30,7-T002,2025-04-24 22:00:00,二级,混合,混合,中,95.29,0.11,-0.17,0.06,,0.0,8.1,,3h同级升8.1℃;3h同级降8.1℃,,,,否
-7号机,30,7-T002,2025-04-25 01:00:00,二级,混合,混合,中,91.54,0.1,-0.18,0.07,,0.0,0.0,8.1,6h同级升8.1℃;6h同级降8.1℃,,,,否
-7号机,30,7-T003,2025-05-20 05:00:00,一级,混合,混合,中,99.4,5.57,4.34,0.23,5.39,-5.52,-5.5,-5.46,级差5.6℃(一级2列缸排气温度-一级4列缸排气温度,平时1.2℃)较平时+4.3℃;一级4列缸排气温度较同级中位-5.4℃(平时+0.0℃),较平时-5.4℃,,,,否
-7号机,30,7-T003,2025-05-20 08:00:00,一级,偏高,短时突升,中,101.36,0.24,-0.97,0.09,1.0,0.03,5.46,0.05,3h同级升5.5℃,,,,否
-7号机,30,7-T004,2025-06-03 10:00:00,一级,混合,混合,中,102.8,12.05,11.47,0.34,11.22,0.03,-11.34,-11.2,级差12.1℃(一级2列缸排气温度-一级4列缸排气温度,平时0.6℃)较平时+11.5℃;3h同级降11.3℃,,,,否
-7号机,30,7-T004,2025-06-03 11:00:00,一级,混合,短时突升,中,103.52,0.82,0.23,0.31,,11.23,0.0,-0.05,1h同级升11.2℃,,,,否
-7号机,30,7-T004,2025-06-03 13:00:00,一级,偏高,短时突升,中,105.04,0.8,0.2,0.26,0.03,0.03,11.18,-0.08,3h同级升11.2℃,,,,否
-7号机,30,7-T004,2025-06-03 16:00:00,一级,偏高,短时突升,中,105.98,0.81,0.22,0.25,0.06,-0.01,-0.02,11.16,6h同级升11.2℃,,,,否
-7号机,30,7-T004,2025-06-05 12:00:00,一级,混合,混合,中,108.39,12.56,11.92,1.02,11.52,-12.01,-11.91,,级差12.6℃(一级4列缸排气温度-一级6列缸排气温度,平时0.6℃)较平时+11.9℃;1h同级降12.0℃,,,,否
-7号机,30,7-T004,2025-06-05 15:00:00,一级,偏高,短时突升,中,107.83,1.07,0.42,0.56,1.01,0.01,12.0,0.09,3h同级升12.0℃,,,,否
-7号机,30,7-T004,2025-06-05 18:00:00,一级,偏高,短时突升,中,106.63,1.07,0.4,0.42,1.15,0.04,0.14,12.14,6h同级升12.1℃,,,,否
-7号机,30,7-T004,2025-06-08 17:00:00,一级,混合,混合,中,111.63,7.87,6.85,0.35,7.55,0.0,-5.97,-5.76,级差7.9℃(一级6列缸排气温度-一级2列缸排气温度,平时1.0℃)较平时+6.9℃;一级2列缸排气温度较同级中位-7.5℃(平时+0.0℃),较平时-7.6℃,,,,否
-7号机,30,7-T004,2025-06-08 18:00:00,一级,混合,短时突升,中,111.02,1.78,0.75,0.37,1.41,6.09,0.03,-0.14,1h同级升6.1℃,,,,否
-7号机,30,7-T004,2025-06-08 20:00:00,一级,偏高,短时突升,中,108.01,1.86,0.81,0.25,1.61,0.09,5.91,-0.05,3h同级升5.9℃,,,,否
-7号机,30,7-T004,2025-06-12 05:00:00,一级,偏低,短时突降,中,107.92,4.57,2.79,1.76,4.15,-5.77,-6.41,-5.88,1h同级降5.8℃,,,,否
-7号机,30,7-T004,2025-06-12 08:00:00,一级,偏高,短时突升,中,110.85,1.87,0.09,1.42,0.38,0.14,5.94,-0.35,3h同级升5.9℃,,,,否
-7号机,30,7-T004,2025-06-12 15:00:00,二级,混合,混合,中,112.32,37.44,37.19,18.84,18.84,,,,二级3列缸排气温度较同级中位+18.7℃(平时-0.1℃),较平时+18.8℃;二级5列缸排气温度较同级中位-18.7℃(平时+0.1℃),较平时-18.8℃,,,,否
-7号机,30,7-T004,2025-06-12 15:00:00,三级,偏高,三级相对偏高,低,81.59,,,0.0,,0.0,0.0,0.0,三级残差+14.1℃,,,,否
 7号机,30,7-T005,2025-07-22 12:00:00,一级,偏高,持续偏高,高,106.23,5.53,4.74,1.58,3.26,-2.56,-3.51,-3.24,级差5.5℃(一级2列缸排气温度-一级6列缸排气温度,平时0.8℃)较平时+4.7℃,,,,否
-7号机,30,7-T006,2025-08-08 12:00:00,一级,混合,混合,中,107.37,11.49,10.15,0.85,11.87,-12.11,-12.26,-12.3,级差11.5℃(一级6列缸排气温度-一级2列缸排气温度,平时1.3℃)较平时+10.1℃;1h同级降12.1℃,,,,否
-7号机,30,7-T006,2025-08-08 14:00:00,一级,混合,混合,中,107.06,29.21,27.87,0.84,29.72,0.07,-29.83,-29.89,级差29.2℃(一级6列缸排气温度-一级2列缸排气温度,平时1.3℃)较平时+27.9℃;一级2列缸排气温度较同级中位-29.1℃(平时+0.6℃),较平时-29.7℃,,,,否
-7号机,30,7-T007,2025-08-28 05:00:00,二级,偏高,持续偏高,高,96.96,5.46,5.17,2.85,2.85,2.71,2.69,2.69,级差5.5℃(二级5列缸排气温度-二级3列缸排气温度,平时0.3℃)较平时+5.2℃,,,,否
-7号机,30,7-T009,2025-09-20 03:00:00,二级,混合,混合,中,87.53,14.59,14.3,7.41,7.41,0.0,7.3,7.18,二级5列缸排气温度较同级中位+7.3℃(平时-0.1℃),较平时+7.4℃;3h同级降7.3℃,,,,否
-7号机,30,7-T009,2025-09-20 04:00:00,二级,混合,混合,中,87.58,0.03,-0.25,0.14,0.14,7.28,0.0,0.03,1h同级升7.3℃;1h同级降7.3℃,,,,否
-7号机,30,7-T009,2025-09-20 06:00:00,二级,混合,混合,中,87.41,0.16,-0.12,0.04,0.04,0.01,7.37,0.07,3h同级升7.4℃;3h同级降7.4℃,,,,否
-7号机,30,7-T009,2025-09-20 09:00:00,二级,混合,混合,中,89.1,0.18,-0.1,0.03,0.03,0.08,0.01,7.38,6h同级升7.4℃;6h同级降7.4℃,,,,否
-7号机,30,7-T009,2025-09-21 05:00:00,一级,混合,混合,中,101.37,6.76,5.82,0.58,5.55,-5.97,-5.6,-5.58,级差6.8℃(一级4列缸排气温度-一级6列缸排气温度,平时0.9℃)较平时+5.8℃;一级6列缸排气温度较同级中位-5.6℃(平时-0.0℃),较平时-5.5℃,,,,否
-7号机,30,7-T009,2025-09-21 08:00:00,一级,偏高,短时突升,中,101.92,1.51,0.53,0.69,0.18,0.11,5.42,0.18,3h同级升5.4℃,,,,否
-7号机,30,7-T009,2025-09-21 11:00:00,一级,偏高,短时突升,中,102.37,1.47,0.45,0.01,0.76,0.26,0.59,6.06,6h同级升6.1℃,,,,否
-7号机,30,7-T010,2025-10-04 19:00:00,二级,混合,混合,中,92.71,16.17,15.88,8.2,7.67,,,,级差16.2℃(二级5列缸排气温度-二级3列缸排气温度,平时0.3℃)较平时+15.9℃;二级3列缸排气温度较同级中位-8.1℃(平时-0.4℃),较平时-7.7℃,,,,否
-7号机,30,7-T010,2025-10-04 22:00:00,二级,混合,混合,中,92.12,0.78,-0.1,0.03,0.03,0.0,7.69,0.01,3h同级升7.7℃;3h同级降7.7℃,,,,否
-7号机,30,7-T010,2025-10-05 01:00:00,二级,混合,混合,中,92.17,0.69,-0.15,0.06,0.06,0.04,0.04,7.74,6h同级升7.7℃;6h同级降7.7℃,,,,否
-7号机,30,7-T010,2025-10-05 20:00:00,一级,偏高,短时突升,中,101.52,1.98,0.0,0.0,0.2,-0.19,5.53,0.08,3h同级升5.5℃,,,,否
-7号机,30,7-T010,2025-10-07 10:00:00,一级,偏高,持续偏高,高,104.79,5.99,4.03,3.99,0.08,1.44,-0.8,4.23,级差6.0℃(一级4列缸排气温度-一级2列缸排气温度,平时2.0℃)较平时+4.0℃,,,,否
-7号机,30,7-T011,2025-11-16 05:00:00,一级,混合,混合,中,94.4,5.88,4.25,0.36,4.13,-5.11,-6.34,-5.74,级差5.9℃(一级2列缸排气温度-一级6列缸排气温度,平时1.6℃)较平时+4.2℃;1h同级降5.1℃,,,,否
-7号机,30,7-T011,2025-11-16 08:00:00,一级,偏高,短时突升,中,94.93,1.47,-0.17,0.37,1.08,0.03,5.49,-0.77,3h同级升5.5℃,,,,否
-7号机,30,7-T011,2025-11-16 11:00:00,一级,偏高,短时突升,中,98.33,1.72,0.08,0.58,1.51,0.18,0.6,6.09,6h同级升6.1℃,,,,否
-7号机,30,7-T011,2025-11-20 05:00:00,一级,偏低,短时突降,中,93.31,5.05,3.66,1.03,4.36,-5.28,-5.14,-5.3,1h同级降5.3℃,,,,否
-7号机,30,7-T011,2025-11-20 08:00:00,一级,偏高,短时突升,中,94.01,1.32,-0.07,0.1,0.33,0.17,4.95,0.13,3h同级升4.9℃,,,,否
+7号机,30,7-T010,2025-10-07 10:00:00,一级,偏高,持续偏高,高,104.79,5.99,4.04,3.99,0.08,1.44,-0.8,4.23,级差6.0℃(一级4列缸排气温度-一级2列缸排气温度,平时1.9℃)较平时+4.0℃,,,,否
 7号机,30,7-T012,2025-12-05 19:00:00,一级,偏高,持续偏高,高,96.92,5.7,4.45,4.17,0.75,0.97,1.04,2.16,一级6列缸排气温度较同级中位+4.2℃(平时+0.0℃),较平时+4.2℃,7-T012,2025-12-06 14:00:00,轻微,是
 7号机,30,7-T012,2025-12-05 22:00:00,一级,偏低,短时突降,中,92.41,1.45,0.19,0.05,0.62,-2.01,-4.13,-2.64,3h同级降4.1℃,7-T012,2025-12-06 14:00:00,轻微,是
-7号机,30,7-T018,2026-03-13 12:00:00,一级,混合,混合,中,94.39,11.16,9.52,0.53,9.61,-10.43,-10.36,-10.11,级差11.2℃(一级2列缸排气温度-一级4列缸排气温度,平时1.6℃)较平时+9.5℃;1h同级降10.4℃,,,,否
-7号机,30,7-T018,2026-03-13 15:00:00,一级,偏高,短时突升,中,93.94,1.56,-0.07,0.0,0.39,0.08,10.35,0.39,3h同级升10.4℃,,,,否
-7号机,30,7-T018,2026-03-13 18:00:00,一级,偏高,短时突升,中,93.75,1.72,-0.12,0.0,0.12,-0.06,-0.16,10.37,6h同级升10.4℃,,,,否
-7号机,30,7-T018,2026-03-14 05:00:00,二级,偏高,持续偏高,高,98.96,5.52,5.5,2.77,2.77,2.76,2.76,2.78,级差5.5℃(二级5列缸排气温度-二级3列缸排气温度,平时0.0℃)较平时+5.5℃,,,,否
-7号机,30,7-T018,2026-03-21 22:00:00,三级,偏低,三级相对偏低,低,54.05,,,0.0,,0.0,0.0,0.0,三级残差-9.6℃,,,,否
-7号机,30,7-T019,2026-03-29 12:00:00,一级,混合,混合,中,96.24,11.78,9.98,1.07,9.73,-10.36,-10.48,-10.4,级差11.8℃(一级2列缸排气温度-一级4列缸排气温度,平时1.8℃)较平时+10.0℃;1h同级降10.4℃,,,,否
-7号机,30,7-T019,2026-03-29 15:00:00,一级,偏高,短时突升,中,96.87,1.96,0.14,0.0,0.26,0.04,10.83,-0.35,3h同级升10.8℃,,,,否
-7号机,30,7-T019,2026-03-29 18:00:00,一级,偏高,短时突升,中,95.92,2.16,0.33,0.34,,0.14,-0.25,10.47,6h同级升10.5℃,,,,否
-7号机,30,7-T019,2026-04-01 13:00:00,一级,混合,混合,中,96.59,7.14,5.23,1.39,3.83,-3.5,-3.6,-3.45,级差7.1℃(一级2列缸排气温度-一级6列缸排气温度,平时1.9℃)较平时+5.2℃;1h同级降3.5℃,,,,否
-7号机,30,7-T019,2026-04-01 16:00:00,一级,偏高,短时突升,中,96.87,1.99,0.08,0.39,,0.22,4.15,-0.43,3h同级升4.2℃,,,,否
-7号机,50,7-T026,2026-05-19 10:00:00,二级,混合,混合,中,101.69,10.7,10.6,5.4,5.4,0.0,5.43,5.4,级差10.7℃(二级3列缸排气温度-二级5列缸排气温度,平时0.1℃)较平时+10.6℃;二级5列缸排气温度较同级中位-5.4℃(平时+0.0℃),较平时-5.4℃,,,,否
-7号机,50,7-T026,2026-05-19 11:00:00,二级,混合,混合,中,105.73,0.43,0.33,0.17,0.17,5.57,0.0,0.17,1h同级升5.6℃;1h同级降5.6℃,,,,否
-7号机,50,7-T026,2026-05-19 13:00:00,二级,混合,混合,中,106.87,0.32,0.22,0.11,0.11,0.04,5.51,0.07,3h同级升5.5℃;3h同级降5.5℃,,,,否
-7号机,50,7-T027,2026-06-02 05:00:00,二级,偏高,持续偏高,高,96.35,6.1,5.39,2.69,2.69,2.66,2.62,2.69,级差6.1℃(二级3列缸排气温度-二级5列缸排气温度,平时0.7℃)较平时+5.4℃,,,,否
-7号机,50,7-T027,2026-06-05 10:00:00,二级,混合,混合,中,105.37,12.12,11.5,5.75,5.75,0.0,5.79,5.79,级差12.1℃(二级3列缸排气温度-二级5列缸排气温度,平时0.6℃)较平时+11.5℃;二级5列缸排气温度较同级中位-6.1℃(平时-0.3℃),较平时-5.8℃,,,,否
-7号机,50,7-T027,2026-06-05 11:00:00,二级,混合,混合,中,107.44,0.56,-0.07,0.03,0.03,5.78,0.0,0.03,1h同级升5.8℃;1h同级降5.8℃,,,,否
-7号机,50,7-T027,2026-06-05 13:00:00,二级,混合,混合,中,109.01,0.57,-0.05,0.02,0.02,0.03,5.77,0.02,3h同级升5.8℃;3h同级降5.8℃,,,,否
-7号机,50,7-T028,2026-06-30 14:00:00,三级,偏低,三级相对偏低,低,54.06,,,0.0,,,0.0,0.0,三级残差-18.7℃,,,,否
-7号机,50,7-T030,2026-07-13 17:00:00,一级,混合,混合,中,107.73,7.08,5.44,0.8,5.26,0.05,-5.89,,级差7.1℃(一级2列缸排气温度-一级4列缸排气温度,平时1.6℃)较平时+5.4℃;一级4列缸排气温度较同级中位-5.3℃(平时+0.0℃),较平时-5.3℃,,,,否
-7号机,50,7-T030,2026-07-13 18:00:00,一级,混合,短时突升,中,107.99,1.87,0.24,0.16,0.32,5.89,0.03,,1h同级升5.9℃,,,,否
-8号机,48,8-T017,2025-01-01 03:00:00,一级,混合,混合,中,83.14,12.64,10.57,0.63,13.94,0.01,,,级差12.6℃(一级4列缸排气温度-一级2列缸排气温度,平时2.1℃)较平时+10.6℃;一级2列缸排气温度较同级中位-12.0℃(平时+1.9℃),较平时-13.9℃,,,,否
-8号机,48,8-T017,2025-01-01 04:00:00,一级,混合,短时突升,中,84.64,2.05,-0.01,0.0,0.37,14.07,,,1h同级升14.1℃,,,,否
-8号机,48,8-T017,2025-01-01 06:00:00,一级,偏高,短时突升,中,84.44,2.08,0.01,0.0,0.49,0.04,14.09,,3h同级升14.1℃,,,,否
-8号机,48,8-T017,2025-01-01 09:00:00,一级,偏高,短时突升,中,84.51,2.09,0.02,0.0,0.66,-0.06,0.16,13.94,6h同级升13.9℃,,,,否
-8号机,48,8-T021,2025-01-18 12:00:00,二级,偏高,持续偏高,高,82.77,8.5,7.58,4.71,4.71,,,,二级5列缸排气温度较同级中位+4.3℃(平时-0.5℃),较平时+4.7℃,,,,否
-8号机,48,8-T021,2025-01-18 15:00:00,二级,混合,混合,中,86.34,0.96,0.04,0.02,0.02,0.0,4.73,,3h同级升4.7℃;3h同级降4.7℃,,,,否
-8号机,48,8-T021,2025-01-29 19:00:00,一级,混合,混合,中,83.21,14.97,13.01,0.43,13.16,-13.78,-13.51,-13.3,级差15.0℃(一级2列缸排气温度-一级4列缸排气温度,平时2.0℃)较平时+13.0℃;一级4列缸排气温度较同级中位-13.2℃(平时+0.0℃),较平时-13.2℃,,,,否
-8号机,48,8-T021,2025-01-29 22:00:00,一级,混合,混合,中,80.74,0.51,-1.46,0.25,,0.0,6.83,0.13,3h同级升6.8℃;3h同级降6.8℃,,,,否
-8号机,48,8-T021,2025-01-30 01:00:00,一级,偏高,短时突升,中,81.43,1.88,-0.08,0.0,0.1,0.07,0.01,13.58,6h同级升13.6℃,,,,否
-8号机,48,8-T021,2025-02-02 12:00:00,一级,混合,混合,中,85.06,11.71,9.76,0.44,9.34,-9.22,-9.28,-9.19,级差11.7℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+9.8℃;1h同级降9.2℃,,,,否
-8号机,48,8-T021,2025-02-02 15:00:00,一级,偏高,短时突升,中,85.65,2.35,0.39,0.54,,0.03,9.37,0.43,3h同级升9.4℃,,,,否
-8号机,48,8-T021,2025-02-02 18:00:00,一级,偏高,短时突升,中,84.44,2.49,0.54,0.42,0.14,-0.14,-0.15,9.2,6h同级升9.2℃,,,,否
-8号机,48,8-T021,2025-02-13 10:00:00,一级,混合,混合,中,81.37,10.75,8.78,0.0,9.1,0.02,-8.72,-8.78,级差10.7℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+8.8℃;一级6列缸排气温度较同级中位-9.6℃(平时-0.5℃),较平时-9.1℃,,,,否
-8号机,48,8-T021,2025-02-13 11:00:00,一级,混合,混合,中,81.99,1.97,0.0,-0.45,0.46,4.39,0.0,0.01,1h同级升4.4℃;1h同级降4.4℃,,,,否
-8号机,48,8-T021,2025-02-13 13:00:00,一级,偏高,短时突升,中,84.65,1.91,-0.05,0.0,0.18,0.01,8.83,0.12,3h同级升8.8℃,,,,否
-8号机,48,8-T021,2025-02-13 16:00:00,一级,偏高,短时突升,中,85.71,1.99,0.02,0.0,0.1,-0.05,0.08,8.75,6h同级升8.8℃,,,,否
-8号机,48,8-T023,2025-03-24 03:00:00,二级,混合,混合,中,87.69,14.0,13.12,7.44,7.44,0.0,7.46,7.47,二级5列缸排气温度较同级中位+7.0℃(平时-0.4℃),较平时+7.4℃;3h同级降7.5℃,,,,否
-8号机,48,8-T023,2025-03-24 04:00:00,二级,混合,混合,中,87.83,0.88,0.0,0.0,0.0,7.44,0.0,0.02,1h同级升7.4℃;1h同级降7.4℃,,,,否
-8号机,48,8-T023,2025-03-24 06:00:00,二级,混合,混合,中,86.04,0.89,0.01,0.0,0.0,0.01,7.44,0.02,3h同级升7.4℃;3h同级降7.4℃,,,,否
-8号机,48,8-T023,2025-03-24 09:00:00,二级,混合,混合,中,91.1,0.86,-0.02,0.01,0.01,0.0,0.01,7.43,6h同级升7.4℃;6h同级降7.4℃,,,,否
-8号机,48,8-T023,2025-03-26 12:00:00,二级,混合,混合,中,102.03,10.69,9.81,5.79,5.79,5.77,,,级差10.7℃(二级5列缸排气温度-二级3列缸排气温度,平时0.9℃)较平时+9.8℃;二级3列缸排气温度较同级中位-5.3℃(平时+0.4℃),较平时-5.8℃,,,,否
-8号机,48,8-T023,2025-03-26 15:00:00,二级,混合,混合,中,102.28,0.89,0.01,0.01,0.01,0.0,5.79,,3h同级升5.8℃;3h同级降5.8℃,,,,否
-8号机,31,8-T001,2025-04-06 10:00:00,三级,偏低,三级相对偏低,低,53.61,,,0.0,,,0.0,0.0,三级残差-11.3℃,,,,否
-8号机,31,8-T002,2025-04-21 10:00:00,二级,混合,混合,中,92.66,9.48,8.57,5.19,5.19,0.0,5.24,5.19,级差9.5℃(二级5列缸排气温度-二级3列缸排气温度,平时0.9℃)较平时+8.6℃;二级3列缸排气温度较同级中位-4.7℃(平时+0.5℃),较平时-5.2℃,,,,否
-8号机,31,8-T002,2025-04-21 11:00:00,二级,混合,混合,中,93.46,0.9,-0.01,0.0,0.0,5.19,0.0,0.02,1h同级升5.2℃;1h同级降5.2℃,,,,否
-8号机,31,8-T002,2025-04-21 13:00:00,二级,混合,混合,中,94.47,0.9,-0.01,0.0,0.0,0.01,5.19,0.05,3h同级升5.2℃;3h同级降5.2℃,,,,否
-8号机,31,8-T003,2025-04-30 05:00:00,二级,偏高,持续偏高,高,87.88,5.74,4.8,2.4,2.4,2.41,2.37,2.38,级差5.7℃(二级3列缸排气温度-二级5列缸排气温度,平时0.9℃)较平时+4.8℃,,,,否
-8号机,31,8-T006,2025-06-21 20:00:00,一级,偏高,短时突升,中,104.57,1.38,-0.04,0.06,,-0.04,5.94,-0.05,3h同级升5.9℃,,,,否
-8号机,31,8-T006,2025-06-25 10:00:00,一级,混合,混合,中,100.95,10.29,8.81,0.56,11.08,0.01,-11.31,-11.3,级差10.3℃(一级4列缸排气温度-一级2列缸排气温度,平时1.5℃)较平时+8.8℃;3h同级降11.3℃,,,,否
-8号机,31,8-T006,2025-06-25 11:00:00,一级,混合,短时突升,中,102.49,1.56,0.08,0.0,0.55,11.2,0.19,0.43,1h同级升11.2℃,,,,否
-8号机,31,8-T006,2025-06-25 13:00:00,一级,偏高,短时突升,中,102.9,1.56,0.08,0.0,0.55,0.03,11.19,0.41,3h同级升11.2℃,,,,否
-8号机,31,8-T006,2025-06-25 16:00:00,一级,偏高,短时突升,中,103.94,1.51,0.03,0.0,0.57,-0.01,-0.06,11.12,6h同级升11.1℃,,,,否
-8号机,31,8-T006,2025-07-02 08:00:00,一级,混合,混合,中,105.35,30.62,29.03,0.24,28.78,-28.84,-28.62,-28.42,级差30.6℃(一级2列缸排气温度-一级6列缸排气温度,平时1.6℃)较平时+29.0℃;一级6列缸排气温度较同级中位-29.1℃(平时-0.3℃),较平时-28.8℃,,,,否
-8号机,31,8-T008,2025-09-30 12:00:00,二级,混合,混合,中,98.9,10.23,9.27,5.6,5.59,,,5.53,级差10.2℃(二级5列缸排气温度-二级3列缸排气温度,平时1.0℃)较平时+9.3℃;二级3列缸排气温度较同级中位-5.1℃(平时+0.5℃),较平时-5.6℃,,,,否
-8号机,31,8-T008,2025-09-30 15:00:00,二级,混合,混合,中,101.62,0.93,-0.03,0.02,0.02,0.0,5.58,,3h同级升5.6℃;3h同级降5.6℃,,,,否
-8号机,31,8-T008,2025-10-01 10:00:00,一级,混合,混合,中,101.85,13.14,11.14,0.01,11.14,0.0,-11.06,-11.0,级差13.1℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+11.1℃;3h同级降11.1℃,8-T008,2025-10-01 15:00:00,严重,是
-8号机,31,8-T008,2025-10-01 11:00:00,一级,混合,短时突升,中,102.14,2.01,0.01,0.0,0.02,11.12,0.01,-0.25,1h同级升11.1℃,8-T008,2025-10-01 15:00:00,严重,是
-8号机,31,8-T008,2025-10-01 12:00:00,一级,混合,混合,中,101.92,12.59,10.59,0.54,10.59,,,,级差12.6℃(一级2列缸排气温度-一级4列缸排气温度,平时2.0℃)较平时+10.6℃;一级4列缸排气温度较同级中位-10.6℃(平时+0.0℃),较平时-10.6℃,8-T008,2025-10-01 15:00:00,严重,是
-8号机,31,8-T008,2025-10-01 13:00:00,一级,混合,混合,中,101.34,1.98,-0.02,-0.45,0.47,0.01,5.58,0.02,3h同级升5.6℃;3h同级降5.6℃,8-T008,2025-10-01 15:00:00,严重,是
-8号机,31,8-T008,2025-10-01 18:00:00,一级,偏高,短时突升,中,99.81,1.99,-0.01,0.0,0.01,-0.01,-0.02,11.14,6h同级升11.1℃,,,,否
-8号机,31,8-T009,2025-10-23 03:00:00,二级,混合,混合,中,82.03,12.98,12.04,6.96,6.96,0.0,6.9,6.88,二级5列缸排气温度较同级中位+6.5℃(平时-0.5℃),较平时+7.0℃;二级3列缸排气温度较同级中位-6.5℃(平时+0.5℃),较平时-7.0℃,,,,否
-8号机,31,8-T009,2025-10-23 04:00:00,二级,混合,混合,中,82.7,0.97,0.03,0.01,0.02,6.97,0.0,0.07,1h同级升7.0℃;1h同级降7.0℃,,,,否
-8号机,31,8-T009,2025-10-23 06:00:00,二级,混合,混合,中,81.92,0.94,-0.0,0.0,0.0,0.01,6.96,0.06,3h同级升7.0℃;3h同级降7.0℃,,,,否
-8号机,31,8-T009,2025-10-23 09:00:00,二级,混合,混合,中,84.23,0.96,0.02,0.01,0.01,0.01,0.01,6.97,6h同级升7.0℃;6h同级降7.0℃,,,,否
-8号机,31,8-T012,2025-12-16 12:00:00,一级,混合,混合,中,94.54,12.37,9.89,0.63,9.83,-10.4,-10.29,-10.38,级差12.4℃(一级2列缸排气温度-一级4列缸排气温度,平时2.5℃)较平时+9.9℃;1h同级降10.4℃,,,,否
-8号机,31,8-T012,2025-12-16 15:00:00,一级,偏高,短时突升,中,95.46,2.49,0.01,0.14,,0.12,10.29,0.04,3h同级升10.3℃,,,,否
-8号机,31,8-T012,2025-12-16 18:00:00,一级,偏高,短时突升,中,93.73,2.21,-0.27,0.35,,-0.17,0.21,10.08,6h同级升10.1℃,,,,否
-8号机,31,8-T013,2025-12-31 19:00:00,二级,混合,混合,中,78.61,13.91,12.87,6.44,6.44,,,,二级3列缸排气温度较同级中位+7.0℃(平时+0.5℃),较平时+6.4℃;二级5列缸排气温度较同级中位-7.0℃(平时-0.5℃),较平时-6.4℃,,,,否
-8号机,31,8-T013,2025-12-31 22:00:00,二级,混合,混合,中,78.48,1.05,0.01,0.01,0.01,0.0,6.43,0.06,3h同级升6.4℃;3h同级降6.4℃,,,,否
-8号机,31,8-T013,2026-01-01 01:00:00,二级,混合,混合,中,78.67,1.02,-0.02,0.01,0.01,0.01,0.02,6.45,6h同级升6.4℃;6h同级降6.4℃,,,,否
-8号机,31,8-T014,2026-01-10 20:00:00,三级,偏低,三级相对偏低,低,45.26,,,0.0,,,,,三级残差-10.2℃,,,,否
-8号机,31,8-T015,2026-03-15 19:00:00,二级,混合,混合,中,86.16,15.16,14.23,7.11,7.11,,,,二级3列缸排气温度较同级中位+7.6℃(平时+0.5℃),较平时+7.1℃;二级5列缸排气温度较同级中位-7.6℃(平时-0.5℃),较平时-7.1℃,,,,否
-8号机,31,8-T015,2026-03-15 22:00:00,二级,混合,混合,中,84.83,1.18,0.24,0.12,0.12,0.0,6.99,0.09,3h同级升7.0℃;3h同级降7.0℃,,,,否
-8号机,31,8-T015,2026-03-16 01:00:00,二级,混合,混合,中,84.56,1.12,0.18,0.09,0.09,0.0,0.03,7.02,6h同级升7.0℃;6h同级降7.0℃,,,,否
-8号机,51,8-T027,2026-05-31 10:00:00,二级,混合,混合,中,94.26,9.39,8.46,5.17,5.17,0.0,5.17,5.13,级差9.4℃(二级5列缸排气温度-二级3列缸排气温度,平时0.9℃)较平时+8.5℃;二级3列缸排气温度较同级中位-4.7℃(平时+0.5℃),较平时-5.2℃,,,,否
-8号机,51,8-T027,2026-05-31 11:00:00,二级,混合,混合,中,98.14,1.07,0.13,0.07,0.07,5.23,0.0,0.05,1h同级升5.2℃;1h同级降5.2℃,,,,否
-8号机,51,8-T027,2026-05-31 13:00:00,二级,混合,混合,中,100.48,1.08,0.14,0.07,0.07,0.0,5.24,0.07,3h同级升5.2℃;3h同级降5.2℃,,,,否
-8号机,51,8-T027,2026-06-09 05:00:00,一级,偏低,持续偏低,高,96.59,4.24,2.06,0.68,5.57,-5.5,-5.49,-5.57,一级2列缸排气温度较同级中位-3.6℃(平时+2.0℃),较平时-5.6℃,,,,否
-8号机,51,8-T027,2026-06-09 08:00:00,一级,偏高,短时突升,中,100.12,2.05,-0.13,0.0,0.63,0.11,5.61,0.21,3h同级升5.6℃,,,,否
-8号机,51,8-T027,2026-06-13 05:00:00,一级,偏低,持续偏低,高,97.22,3.81,1.79,0.2,5.42,-5.21,-5.63,-5.57,一级2列缸排气温度较同级中位-3.6℃(平时+1.8℃),较平时-5.4℃,,,,否
-8号机,51,8-T027,2026-06-13 08:00:00,一级,偏高,短时突升,中,100.37,1.91,-0.11,0.0,0.21,0.02,5.39,0.18,3h同级升5.4℃,,,,否
-8号机,51,8-T028,2026-07-21 10:00:00,一级,混合,混合,中,105.18,9.91,7.69,0.33,11.6,0.17,-11.9,0.08,级差9.9℃(一级4列缸排气温度-一级2列缸排气温度,平时2.2℃)较平时+7.7℃;3h同级降11.9℃,,,,否
-8号机,51,8-T028,2026-07-21 11:00:00,一级,混合,短时突升,中,107.84,2.26,0.04,0.0,0.06,11.84,0.03,-0.01,1h同级升11.8℃,,,,否
-8号机,51,8-T028,2026-07-21 13:00:00,一级,偏高,短时突升,中,108.71,2.18,-0.04,0.0,0.04,-0.06,11.76,-0.14,3h同级升11.8℃,,,,否
-8号机,51,8-T028,2026-07-21 16:00:00,一级,偏高,短时突升,中,106.68,2.16,-0.06,0.0,0.08,0.12,0.02,11.74,6h同级升11.7℃,,,,否
-8号机,51,8-T028,2026-07-22 12:00:00,一级,混合,混合,中,107.23,13.72,11.52,0.0,11.81,-11.65,-11.48,-11.45,级差13.7℃(一级2列缸排气温度-一级6列缸排气温度,平时2.2℃)较平时+11.5℃;1h同级降11.7℃,,,,否
-8号机,51,8-T028,2026-07-22 15:00:00,一级,偏高,短时突升,中,108.36,2.25,0.05,0.0,0.09,0.14,11.47,-0.08,3h同级升11.5℃,,,,否
-8号机,51,8-T028,2026-07-22 18:00:00,一级,偏高,短时突升,中,107.08,1.93,-0.27,0.07,0.2,0.05,-0.16,11.8,6h同级升11.8℃,,,,否
-9号机,32,9-T001,2025-04-17 12:00:00,三级,偏高,三级相对偏高,低,79.94,,,0.0,,0.0,0.0,0.0,三级残差+9.9℃,,,,否
-9号机,32,9-T001,2025-04-17 13:00:00,三级,偏高,三级相对偏高,低,79.94,,,0.0,,0.0,0.0,0.0,三级残差+9.7℃,,,,否
-9号机,32,9-T001,2025-04-17 16:00:00,三级,偏高,三级相对偏高,低,80.0,,,0.0,,0.0,0.0,0.0,三级残差+9.9℃,,,,否
-9号机,32,9-T002,2025-05-19 17:00:00,二级,偏高,持续偏高,高,107.19,6.74,5.83,2.92,2.91,0.0,2.95,2.94,级差6.7℃(二级3列缸排气温度-二级5列缸排气温度,平时0.9℃)较平时+5.8℃,,,,否
-9号机,32,9-T002,2025-05-23 10:00:00,三级,偏低,三级相对偏低,低,51.59,,,0.0,,,0.0,0.0,三级残差-11.5℃,,,,否
-9号机,32,9-T002,2025-05-26 05:00:00,一级,偏低,短时突降,中,96.73,6.19,3.85,1.37,3.87,-5.33,-5.35,-5.32,1h同级降5.3℃,,,,否
-9号机,32,9-T002,2025-05-26 08:00:00,一级,偏高,短时突升,中,98.9,2.27,-0.08,0.0,0.17,0.0,5.31,0.04,3h同级升5.3℃,,,,否
-9号机,32,9-T002,2025-05-28 17:00:00,一级,混合,短时突降,中,102.99,4.94,2.64,1.41,4.65,0.02,-5.8,-5.8,3h同级降5.8℃,,,,否
-9号机,32,9-T002,2025-05-28 18:00:00,一级,混合,短时突升,中,102.91,2.02,-0.29,0.23,0.04,5.78,0.02,-0.03,1h同级升5.8℃,,,,否
-9号机,32,9-T002,2025-05-28 20:00:00,一级,偏高,短时突升,中,101.13,2.05,-0.25,0.22,0.01,-0.02,5.8,0.01,3h同级升5.8℃,,,,否
-9号机,32,9-T006,2025-07-21 10:00:00,一级,混合,混合,中,106.28,10.68,8.3,1.27,10.7,0.0,5.98,-11.83,级差10.7℃(一级4列缸排气温度-一级2列缸排气温度,平时2.4℃)较平时+8.3℃;一级2列缸排气温度较同级中位-9.6℃(平时+1.1℃),较平时-10.7℃,9-T006,2025-07-21 15:00:00,严重,是
-9号机,32,9-T006,2025-07-21 11:00:00,一级,混合,短时突升,中,107.94,2.3,-0.08,0.17,,11.88,0.0,0.06,1h同级升11.9℃,9-T006,2025-07-21 15:00:00,严重,是
-9号机,32,9-T006,2025-07-21 12:00:00,一级,混合,混合,中,107.99,13.07,10.7,1.27,10.76,,,,级差13.1℃(一级2列缸排气温度-一级4列缸排气温度,平时2.4℃)较平时+10.7℃;一级4列缸排气温度较同级中位-10.8℃(平时+0.0℃),较平时-10.8℃,9-T006,2025-07-21 15:00:00,严重,是
-9号机,32,9-T006,2025-07-21 12:00:00,二级,混合,混合,中,100.85,11.88,11.19,5.59,5.59,,,,级差11.9℃(二级3列缸排气温度-二级5列缸排气温度,平时0.7℃)较平时+11.2℃;二级5列缸排气温度较同级中位-5.9℃(平时-0.3℃),较平时-5.6℃,,,,否
-9号机,32,9-T006,2025-07-21 13:00:00,一级,混合,混合,中,108.23,2.31,-0.07,0.11,,0.0,5.95,0.03,3h同级升5.9℃;3h同级降5.9℃,9-T006,2025-07-21 15:00:00,严重,是
-9号机,32,9-T006,2025-07-21 15:00:00,二级,混合,混合,中,100.58,0.75,0.05,0.03,0.03,0.0,5.57,0.02,3h同级升5.6℃;3h同级降5.6℃,,,,否
-9号机,32,9-T006,2025-07-21 18:00:00,一级,偏高,短时突升,中,107.0,2.33,-0.04,0.16,,0.0,-0.0,11.85,6h同级升11.9℃,,,,否
-9号机,32,9-T006,2025-07-22 05:00:00,一级,偏低,短时突降,中,104.28,4.73,2.36,1.27,4.72,-5.84,-5.85,-5.88,1h同级降5.8℃,,,,否
-9号机,32,9-T006,2025-07-22 08:00:00,一级,偏高,短时突升,中,105.95,2.21,-0.15,0.17,,0.01,5.81,0.1,3h同级升5.8℃,,,,否
-9号机,32,9-T006,2025-07-24 17:00:00,二级,偏高,持续偏高,高,103.05,4.86,4.11,2.81,2.81,0.0,2.91,2.93,级差4.9℃(二级5列缸排气温度-二级3列缸排气温度,平时0.8℃)较平时+4.1℃,,,,否
-9号机,32,9-T008,2025-08-20 12:00:00,二级,混合,混合,中,106.19,12.8,11.76,5.88,5.88,,,,级差12.8℃(二级3列缸排气温度-二级5列缸排气温度,平时1.0℃)较平时+11.8℃;二级5列缸排气温度较同级中位-6.4℃(平时-0.5℃),较平时-5.9℃,,,,否
-9号机,32,9-T008,2025-08-20 15:00:00,二级,混合,混合,中,105.91,1.02,-0.03,0.01,0.01,0.0,5.89,0.09,3h同级升5.9℃;3h同级降5.9℃,,,,否
-9号机,32,9-T008,2025-08-24 03:00:00,三级,偏低,三级相对偏低,低,56.35,,,0.0,,,0.0,0.0,三级残差-11.9℃,,,,否
-9号机,32,9-T009,2025-08-30 12:00:00,一级,混合,混合,中,105.89,11.1,9.23,1.29,10.75,-11.84,-11.88,-11.9,级差11.1℃(一级4列缸排气温度-一级2列缸排气温度,平时1.9℃)较平时+9.2℃;1h同级降11.8℃,,,,否
-9号机,32,9-T009,2025-08-30 15:00:00,一级,偏高,短时突升,中,106.35,1.71,-0.16,0.31,,0.01,11.84,-0.03,3h同级升11.8℃,,,,否
-9号机,32,9-T009,2025-08-30 18:00:00,一级,偏高,短时突升,中,105.55,1.72,-0.15,0.3,,-0.02,-0.01,11.84,6h同级升11.8℃,,,,否
-9号机,32,9-T009,2025-08-31 19:00:00,三级,偏低,三级相对偏低,低,59.1,,,0.0,,0.0,0.0,0.0,三级残差-11.4℃,,,,否
-9号机,32,9-T009,2025-08-31 21:00:00,三级,偏低,三级相对偏低,低,53.32,,,0.0,,,0.0,0.0,三级残差-15.7℃,,,,否
-9号机,32,9-T011,2025-10-06 05:00:00,一级,混合,混合,中,101.34,7.63,5.64,0.14,5.52,-5.54,-5.56,,级差7.6℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+5.6℃;一级6列缸排气温度较同级中位-6.6℃(平时-1.1℃),较平时-5.5℃,,,,否
-9号机,32,9-T011,2025-10-06 08:00:00,一级,偏高,短时突升,中,101.35,2.12,0.14,0.21,,0.04,5.5,0.04,3h同级升5.5℃,,,,否
-9号机,32,9-T011,2025-10-20 17:00:00,一级,混合,混合,中,96.92,7.56,5.29,0.04,5.24,0.0,-5.28,-5.28,级差7.6℃(一级2列缸排气温度-一级6列缸排气温度,平时2.3℃)较平时+5.3℃;一级6列缸排气温度较同级中位-6.6℃(平时-1.3℃),较平时-5.2℃,,,,否
-9号机,32,9-T011,2025-10-20 18:00:00,一级,混合,短时突升,中,96.87,2.3,0.03,0.04,,5.26,0.0,-0.03,1h同级升5.3℃,,,,否
-9号机,32,9-T011,2025-10-20 20:00:00,一级,偏高,短时突升,中,96.83,2.3,0.03,0.06,,-0.0,5.26,0.01,3h同级升5.3℃,,,,否
-9号机,32,9-T011,2025-10-21 10:00:00,一级,混合,混合,中,97.13,9.91,7.64,1.31,9.56,0.0,-10.87,-10.87,级差9.9℃(一级4列缸排气温度-一级2列缸排气温度,平时2.3℃)较平时+7.6℃;一级2列缸排气温度较同级中位-8.6℃(平时+1.0℃),较平时-9.6℃,,,,否
-9号机,32,9-T011,2025-10-21 11:00:00,一级,混合,短时突升,中,98.43,2.27,0.01,0.03,,10.88,0.0,0.01,1h同级升10.9℃,,,,否
-9号机,32,9-T011,2025-10-21 13:00:00,一级,偏高,短时突升,中,100.63,2.25,-0.02,0.02,,0.05,10.85,-0.02,3h同级升10.9℃,,,,否
-9号机,32,9-T011,2025-10-21 16:00:00,一级,偏高,短时突升,中,99.72,2.32,0.05,0.0,0.09,-0.08,-0.07,10.84,6h同级升10.8℃,,,,否
-9号机,32,9-T016,2025-11-13 15:00:00,三级,偏高,三级相对偏高,低,74.52,,,0.0,,,,,三级残差+9.8℃,,,,否
-9号机,32,9-T016,2025-11-14 10:00:00,三级,偏高,三级相对偏高,低,72.02,,,0.0,,0.0,0.0,0.0,三级残差+10.4℃,,,,否
-9号机,32,9-T017,2026-01-31 10:00:00,一级,混合,混合,中,90.87,9.07,6.62,1.24,9.17,0.03,-10.3,-10.14,级差9.1℃(一级4列缸排气温度-一级2列缸排气温度,平时2.4℃)较平时+6.6℃;一级2列缸排气温度较同级中位-7.9℃(平时+1.2℃),较平时-9.2℃,,,,否
-9号机,32,9-T017,2026-01-31 11:00:00,一级,混合,短时突升,中,92.41,2.26,-0.19,0.11,0.1,10.19,0.04,-0.06,1h同级升10.2℃,,,,否
-9号机,32,9-T017,2026-01-31 13:00:00,一级,偏高,短时突升,中,92.87,2.47,0.03,0.0,0.02,-0.26,10.28,0.14,3h同级升10.3℃,,,,否
-9号机,32,9-T017,2026-01-31 16:00:00,一级,偏高,短时突升,中,92.71,2.41,-0.04,0.05,,0.05,0.06,10.29,6h同级升10.3℃,,,,否
-9号机,32,9-T017,2026-02-01 17:00:00,一级,混合,短时突降,中,91.16,4.03,1.59,1.25,4.05,0.02,-5.18,-5.18,3h同级降5.2℃,,,,否
-9号机,32,9-T017,2026-02-01 18:00:00,一级,混合,短时突升,中,91.78,2.25,-0.2,0.08,0.12,5.1,0.01,-0.05,1h同级升5.1℃,,,,否
-9号机,32,9-T017,2026-02-01 20:00:00,一级,偏高,短时突升,中,91.51,2.31,-0.13,0.06,0.07,0.03,5.16,0.04,3h同级升5.2℃,,,,否
-9号机,32,9-T018,2026-02-04 01:00:00,三级,偏低,三级相对偏低,低,47.58,,,0.0,,0.0,0.0,,三级残差-15.3℃,,,,否
-9号机,32,9-T018,2026-02-04 03:00:00,三级,偏低,三级相对偏低,低,51.28,,,0.0,,,0.0,0.0,三级残差-11.7℃,,,,否
-9号机,32,9-T018,2026-02-04 19:00:00,一级,混合,混合,中,93.94,16.45,14.01,1.53,13.78,-15.23,-14.92,-15.27,级差16.5℃(一级2列缸排气温度-一级4列缸排气温度,平时2.4℃)较平时+14.0℃;一级4列缸排气温度较同级中位-13.8℃(平时+0.0℃),较平时-13.8℃,,,,否
-9号机,32,9-T020,2026-03-24 19:00:00,三级,偏低,三级相对偏低,低,52.68,,,0.0,,,,0.0,三级残差-10.4℃,9-T020,2026-03-24 23:00:00,轻微,是
-9号机,32,9-T020,2026-03-24 20:00:00,三级,偏低,三级相对偏低,低,52.31,,,0.0,,0.0,,,三级残差-10.2℃,9-T020,2026-03-24 23:00:00,轻微,是
-9号机,32,9-T020,2026-03-25 16:00:00,三级,偏低,三级相对偏低,低,57.47,,,0.0,,0.0,0.0,0.0,三级残差-9.7℃,9-T020,2026-03-25 18:00:00,轻微,是
-9号机,32,9-T020,2026-03-25 17:00:00,一级,混合,混合,中,96.55,7.36,5.28,0.0,5.39,0.04,-5.41,-5.46,级差7.4℃(一级2列缸排气温度-一级6列缸排气温度,平时2.1℃)较平时+5.3℃;一级6列缸排气温度较同级中位-6.4℃(平时-1.1℃),较平时-5.4℃,,,,否
-9号机,32,9-T020,2026-03-25 18:00:00,一级,混合,短时突升,中,96.01,1.92,-0.16,0.08,0.05,5.44,0.01,-0.02,1h同级升5.4℃,,,,否
-9号机,32,9-T020,2026-03-25 20:00:00,一级,偏高,短时突升,中,95.13,1.95,-0.12,0.03,0.05,0.06,5.41,0.01,3h同级升5.4℃,,,,否
-9号机,32,9-T020,2026-03-26 02:00:00,三级,偏低,三级相对偏低,低,52.91,,,0.0,,,0.0,0.0,三级残差-10.5℃,9-T020,2026-03-26 10:00:00,轻微,是
-9号机,32,9-T020,2026-03-26 03:00:00,三级,偏低,三级相对偏低,低,52.98,,,0.0,,0.0,,0.0,三级残差-10.3℃,9-T020,2026-03-26 10:00:00,轻微,是
-9号机,32,9-T021,2026-04-03 17:00:00,一级,混合,混合,中,97.44,6.62,4.43,1.02,4.67,0.1,-5.3,-5.39,级差6.6℃(一级2列缸排气温度-一级4列缸排气温度,平时2.2℃)较平时+4.4℃;3h同级降5.3℃,,,,否
-9号机,32,9-T021,2026-04-03 18:00:00,一级,混合,短时突升,中,96.77,2.13,-0.05,0.18,,5.32,0.14,-0.16,1h同级升5.3℃,,,,否
-9号机,32,9-T021,2026-04-03 20:00:00,一级,偏高,短时突升,中,96.09,2.59,0.41,0.33,0.12,0.35,5.16,-0.51,3h同级升5.2℃,,,,否
-9号机,32,9-T021,2026-04-10 12:00:00,一级,混合,混合,中,98.67,12.84,10.81,0.0,11.14,-10.79,-11.04,-10.94,级差12.8℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+10.8℃;1h同级降10.8℃,,,,否
-9号机,32,9-T021,2026-04-10 15:00:00,一级,偏高,短时突升,中,99.16,2.15,0.13,0.0,0.42,0.25,10.69,-0.35,3h同级升10.7℃,,,,否
-9号机,32,9-T021,2026-04-10 18:00:00,一级,偏高,短时突升,中,97.66,2.24,0.21,0.0,0.48,0.04,-0.08,10.6,6h同级升10.6℃,,,,否
-9号机,32,9-T021,2026-04-10 22:00:00,三级,偏低,三级相对偏低,低,53.29,,,0.0,,0.0,0.0,0.0,三级残差-9.6℃,,,,否
-9号机,32,9-T021,2026-04-10 23:00:00,三级,偏低,三级相对偏低,低,52.97,,,0.0,,0.0,0.0,0.0,三级残差-9.7℃,,,,否
-9号机,32,9-T021,2026-04-11 19:00:00,三级,偏低,三级相对偏低,低,47.49,,,0.0,,0.0,0.0,0.0,三级残差-17.8℃,,,,否
-9号机,32,9-T021,2026-04-12 10:00:00,一级,混合,混合,中,97.39,12.56,10.58,0.0,10.69,0.07,-10.37,-10.67,级差12.6℃(一级2列缸排气温度-一级6列缸排气温度,平时2.0℃)较平时+10.6℃;一级6列缸排气温度较同级中位-12.0℃(平时-1.3℃),较平时-10.7℃,,,,否
-9号机,32,9-T021,2026-04-12 11:00:00,一级,混合,短时突升,中,98.28,2.11,0.13,0.0,0.32,10.36,0.08,0.16,1h同级升10.4℃,,,,否
-9号机,32,9-T021,2026-04-12 13:00:00,一级,偏高,短时突升,中,99.42,2.31,0.32,0.0,0.38,-0.05,10.25,-0.12,3h同级升10.3℃,,,,否
-9号机,32,9-T021,2026-04-12 16:00:00,一级,偏高,短时突升,中,99.01,2.25,0.26,0.0,0.4,0.01,-0.06,10.26,6h同级升10.3℃,,,,否
-9号机,32,9-T021,2026-04-17 23:00:00,三级,偏低,三级相对偏低,低,53.39,,,0.0,,0.0,0.0,0.0,三级残差-9.6℃,,,,否
+7号机,30,7-T019,2026-04-01 13:00:00,一级,混合,混合,中,96.59,7.14,5.23,1.39,3.82,-3.5,-3.6,-3.45,级差7.1℃(一级2列缸排气温度-一级6列缸排气温度,平时1.9℃)较平时+5.2℃;1h同级降3.5℃,,,,否
+7号机,30,7-T019,2026-04-01 16:00:00,一级,偏高,短时突升,中,96.87,1.99,0.08,0.39,,0.22,4.15,0.12,3h同级升4.2℃,,,,否

Разница между файлами не показана из-за своего большого размера
+ 814 - 620
_tmp_temperature/out/温度通道异常段.csv


+ 36 - 36
_tmp_temperature/out/温度通道质控.csv

@@ -1,37 +1,37 @@
 机组,点位,点位描述,运行小时数,最小值,最大值,中位数,不同值个数,最长不变小时,零值比例,越界比例,判定,原因
-4号机,YSJ_9,一级1#缸排气温度,2603,0.0,121.0,99.0,1182,20,0.0015,0.0,正常,
-4号机,YSJ_10,一级2#缸排气温度,2603,0.0,123.45,100.53,1204,19,0.0008,0.0,正常,
-4号机,YSJ_11,一级3#缸排气温度,2603,0.0,123.0,102.0,1350,17,0.0012,0.0,正常,
-4号机,YSJ_13,二级1#缸排气温度,2603,0.0,131.42,106.0,1882,8,0.0054,0.0,正常,
-4号机,YSJ_14,二级2#缸排气温度,2603,5.67,128.36,102.83,1894,11,0.0,0.0,正常,
-4号机,YSJ_15,二级3#缸排气温度,2603,0.0,125.63,100.47,1897,7,0.0027,0.0,正常,
-5号机,YSJ_18,一级1#缸排气温度,4819,0.0,117.95,97.59,4321,2,0.0021,0.0,正常,
-5号机,YSJ_20,一级2#缸排气温度,4819,0.0,120.09,96.94,4363,2,0.0023,0.0,正常,
-5号机,YSJ_22,一级3#缸排气温度,4819,0.0,119.94,97.8,4344,2,0.0017,0.0,正常,
-5号机,YSJ_17,二级1#缸排气温度,4819,0.0,137.37,111.31,4498,2,0.001,0.0,正常,
-5号机,YSJ_19,二级2#缸排气温度,4819,0.0,139.15,112.6,4496,2,0.0012,0.0,正常,
-5号机,YSJ_21,二级3#缸排气温度,4819,0.0,137.64,112.01,4476,2,0.001,0.0,正常,
-6号机,YSJ_18,一级1#缸排气温度,5890,0.0,120.1,99.16,5321,2,0.0015,0.0,正常,
-6号机,YSJ_20,一级2#缸排气温度,5890,0.0,120.24,99.36,5360,2,0.0019,0.0,正常,
-6号机,YSJ_22,一级3#缸排气温度,5890,0.0,122.24,99.94,5287,2,0.0014,0.0,正常,
-6号机,YSJ_17,二级1#缸排气温度,5890,0.0,137.39,113.83,5393,2,0.001,0.0,正常,
-6号机,YSJ_19,二级2#缸排气温度,5890,0.0,137.47,113.84,5348,2,0.0015,0.0,正常,
-6号机,YSJ_21,二级3#缸排气温度,5890,0.0,138.6,113.18,5364,2,0.0012,0.0,正常,
-7号机,YSJ_16,一级2列缸排气温度,4910,0.0,113.39,96.63,4418,2,0.0018,0.0,正常,
-7号机,YSJ_17,一级4列缸排气温度,4910,0.0,112.61,95.39,4454,2,0.0022,0.0,正常,
-7号机,YSJ_18,一级6列缸排气温度,4910,0.0,115.49,95.38,4393,2,0.0018,0.0,正常,
-7号机,YSJ_19,二级3列缸排气温度,4910,0.0,115.88,95.79,4508,2,0.0024,0.0,正常,
-7号机,YSJ_20,二级5列缸排气温度,4910,0.0,115.71,95.71,4507,2,0.0029,0.0,正常,
-7号机,YSJ_21,三级1列缸排气温度,4910,0.0,84.84,61.59,4491,2,0.002,0.0,正常,
-8号机,YSJ_16,一级2列缸排气温度,4442,0.0,109.49,96.44,4053,2,0.0025,0.0,正常,
-8号机,YSJ_17,一级4列缸排气温度,4442,0.0,107.93,95.04,4054,2,0.0009,0.0,正常,
-8号机,YSJ_18,一级6列缸排气温度,4442,0.0,108.11,94.62,4045,2,0.0014,0.0,正常,
-8号机,YSJ_19,二级3列缸排气温度,4442,0.0,110.68,88.77,4135,2,0.0029,0.0,正常,
-8号机,YSJ_20,二级5列缸排气温度,4442,0.0,109.58,87.93,4133,2,0.0016,0.0,正常,
-8号机,YSJ_21,三级1列缸排气温度,4442,0.0,81.38,61.79,4060,2,0.0009,0.0,正常,
-9号机,YSJ_16,一级2列缸排气温度,4645,0.0,112.84,98.6,4240,2,0.0024,0.0,正常,
-9号机,YSJ_17,一级4列缸排气温度,4645,0.0,111.72,97.7,4243,2,0.0024,0.0,正常,
-9号机,YSJ_18,一级6列缸排气温度,4645,0.0,110.45,96.46,4235,2,0.0017,0.0,正常,
-9号机,YSJ_19,二级3列缸排气温度,4645,0.0,110.37,90.51,4214,1,0.0011,0.0,正常,
-9号机,YSJ_20,二级5列缸排气温度,4645,0.0,109.7,89.53,4214,2,0.0013,0.0,正常,
-9号机,YSJ_21,三级1列缸排气温度,4645,0.0,80.92,64.6,4241,2,0.003,0.0,正常,
+4号机,YSJ_9,一级1#缸排气温度,2599,73.9,121.0,99.0,1162,20,0.0,0.0,正常,
+4号机,YSJ_10,一级2#缸排气温度,2601,72.98,123.45,100.55,1190,31,0.0,0.0,正常,
+4号机,YSJ_11,一级3#缸排气温度,2600,73.81,123.0,102.0,1331,17,0.0,0.0,正常,
+4号机,YSJ_13,二级1#缸排气温度,2589,65.92,131.42,106.0,1867,8,0.0,0.0,正常,
+4号机,YSJ_14,二级2#缸排气温度,2603,63.8,128.36,102.92,1886,11,0.0,0.0,正常,
+4号机,YSJ_15,二级3#缸排气温度,2596,63.18,125.9,100.58,1876,11,0.0,0.0,正常,
+5号机,YSJ_18,一级1#缸排气温度,4809,50.95,117.95,97.65,4316,2,0.0,0.0,正常,
+5号机,YSJ_20,一级2#缸排气温度,4808,51.45,120.09,97.05,4354,2,0.0,0.0,正常,
+5号机,YSJ_22,一级3#缸排气温度,4811,50.55,119.94,97.91,4335,2,0.0,0.0,正常,
+5号机,YSJ_17,二级1#缸排气温度,4814,62.18,137.37,111.38,4497,2,0.0,0.0,正常,
+5号机,YSJ_19,二级2#缸排气温度,4813,63.11,139.15,112.73,4493,2,0.0,0.0,正常,
+5号机,YSJ_21,二级3#缸排气温度,4814,59.84,137.64,112.12,4470,2,0.0,0.0,正常,
+6号机,YSJ_18,一级1#缸排气温度,5881,19.68,120.1,99.19,5318,2,0.0,0.0,正常,
+6号机,YSJ_20,一级2#缸排气温度,5879,20.23,120.24,99.47,5348,2,0.0,0.0,正常,
+6号机,YSJ_22,一级3#缸排气温度,5882,19.26,122.24,100.0,5280,2,0.0,0.0,正常,
+6号机,YSJ_17,二级1#缸排气温度,5884,27.3,137.39,113.88,5392,2,0.0,0.0,正常,
+6号机,YSJ_19,二级2#缸排气温度,5881,27.75,137.47,113.93,5346,2,0.0,0.0,正常,
+6号机,YSJ_21,二级3#缸排气温度,5883,25.96,138.6,113.27,5363,2,0.0,0.0,正常,
+7号机,YSJ_16,一级2列缸排气温度,4901,79.77,113.39,96.75,4412,2,0.0,0.0,正常,
+7号机,YSJ_17,一级4列缸排气温度,4899,78.26,112.61,95.55,4443,2,0.0,0.0,正常,
+7号机,YSJ_18,一级6列缸排气温度,4901,77.88,115.49,95.55,4385,2,0.0,0.0,正常,
+7号机,YSJ_19,二级3列缸排气温度,4898,76.83,115.88,95.96,4492,2,0.0,0.0,正常,
+7号机,YSJ_20,二级5列缸排气温度,4896,76.55,115.71,95.89,4498,2,0.0,0.0,正常,
+7号机,YSJ_21,三级1列缸排气温度,4900,45.47,84.84,61.81,4483,2,0.0,0.0,正常,
+8号机,YSJ_16,一级2列缸排气温度,4431,79.61,109.49,96.6,4046,2,0.0,0.0,正常,
+8号机,YSJ_17,一级4列缸排气温度,4438,78.3,107.93,95.14,4042,2,0.0,0.0,正常,
+8号机,YSJ_18,一级6列缸排气温度,4436,77.61,108.11,94.72,4040,2,0.0,0.0,正常,
+8号机,YSJ_19,二级3列缸排气温度,4429,73.68,110.68,89.0,4131,2,0.0,0.0,正常,
+8号机,YSJ_20,二级5列缸排气温度,4435,72.86,109.58,88.03,4127,2,0.0,0.0,正常,
+8号机,YSJ_21,三级1列缸排气温度,4438,45.26,81.38,61.84,4057,2,0.0,0.0,正常,
+9号机,YSJ_16,一级2列缸排气温度,4634,79.32,112.84,98.76,4233,2,0.0,0.0,正常,
+9号机,YSJ_17,一级4列缸排气温度,4634,78.23,111.72,97.84,4236,2,0.0,0.0,正常,
+9号机,YSJ_18,一级6列缸排气温度,4637,77.35,110.45,96.54,4231,2,0.0,0.0,正常,
+9号机,YSJ_19,二级3列缸排气温度,4640,59.89,110.37,90.53,4209,1,0.0,0.0,正常,
+9号机,YSJ_20,二级5列缸排气温度,4639,58.73,109.7,89.6,4211,2,0.0,0.0,正常,
+9号机,YSJ_21,三级1列缸排气温度,4631,27.18,80.92,64.75,4226,2,0.0,0.0,正常,

Разница между файлами не показана из-за своего большого размера
+ 61 - 0
_tmp_temperature/out/温度高频候选.csv


Разница между файлами не показана из-за своего большого размера
+ 48 - 62
_tmp_temperature/out/温度高频波动段.csv


+ 15 - 4
_tmp_temperature/rescan.py

@@ -19,7 +19,7 @@ ROOT = Path(__file__).resolve().parents[1]
 if str(ROOT) not in sys.path:
     sys.path.insert(0, str(ROOT))
 
-from _tmp_temperature import unified
+from _tmp_temperature import hf_validation, unified
 from _tmp_temperature.config import build_unit_config
 
 LONG = Path(__file__).resolve().parent / "out" / "pks_temperature_hourly.csv"
@@ -34,6 +34,8 @@ def load_wide(path: Path) -> dict[str, list[dict]]:
         wide = group.pivot_table(index=keys, columns="点位", values="均值", aggfunc="first")
         coverage = group.groupby(keys)["运行覆盖率"].first()
         std = group.pivot_table(index=keys, columns="点位", values="标准差", aggfunc="first")
+        minraw = group.pivot_table(index=keys, columns="点位", values="原始最小值", aggfunc="first")
+        zeros = group.pivot_table(index=keys, columns="点位", values="零值样本数", aggfunc="first")
         high = group.pivot_table(index=keys, columns="点位", values="高报警样本数", aggfunc="first")
         high_high = group.pivot_table(index=keys, columns="点位", values="高高报警样本数", aggfunc="first")
         rows = []
@@ -55,6 +57,12 @@ def load_wide(path: Path) -> dict[str, list[dict]]:
                 svalue = std.loc[(hour_start, batch), column] if column in std.columns else float("nan")
                 if pd.notna(svalue):
                     row[f"{column}__std"] = float(svalue)
+                mvalue = minraw.loc[(hour_start, batch), column] if column in minraw.columns else float("nan")
+                if pd.notna(mvalue):
+                    row[f"{column}__minraw"] = float(mvalue)
+                zvalue = zeros.loc[(hour_start, batch), column] if column in zeros.columns else float("nan")
+                if pd.notna(zvalue):
+                    row[f"{column}__zeros"] = int(zvalue)
                 h = high.loc[(hour_start, batch), column] if column in high.columns else float("nan")
                 hh = high_high.loc[(hour_start, batch), column] if column in high_high.columns else float("nan")
                 row[f"{column}__high"] = 0 if pd.isna(h) else int(h)
@@ -103,11 +111,14 @@ def main() -> None:
         all_hf += hf_segments
 
     output = Path(args.out)
-    unified.write_results(output, all_qc, all_features, all_segments, all_cycles, all_channels, all_observations, all_hf)
-    for level in ("轻微", "异常", "严重"):
+    confirmed_hf, hf_candidates = hf_validation.filter_hf(all_hf)
+    unified.write_results(output, all_qc, all_features, all_segments, all_cycles, all_channels, all_observations,
+                          confirmed_hf, hf_candidates)
+    for level in ("轻微", "异常", "严重异常"):
         print(f"  {level}: {sum(1 for segment in all_segments if segment['温度阶段'] == level):,}")
     print(f"  观察: {len(all_observations):,}")
-    print(f"  高频波动: {len(all_hf):,}")
+    print(f"  高频候选: {len(hf_candidates):,}  高频确认: {len(confirmed_hf):,}")
+    print(f"  合并段: {len(all_segments) + len(confirmed_hf):,}")
     print(f"written -> {output}")
 
 

+ 10 - 5
_tmp_temperature/scan.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-"""Cylinder-temperature scan (4#~9#) with rule-based 轻微/异常/严重 events.
+"""Cylinder-temperature scan (4#~9#) with rule-based 轻微/异常/严重异常 events.
 
 Examples
 --------
@@ -22,6 +22,7 @@ if str(ROOT) not in sys.path:
     sys.path.insert(0, str(ROOT))
 
 from _tmp_temperature import unified as temperature_algorithm
+from _tmp_temperature import hf_validation
 from _tmp_temperature import data as temperature_data
 from _tmp_temperature.config import (
     CYLINDERS,
@@ -108,6 +109,8 @@ def hourly_long_rows(rows: list[dict], config: UnitConfig, include_packing: bool
                 "最小值": row.get(f"{column}__min"),
                 "最大值": row.get(f"{column}__max"),
                 "标准差": row.get(f"{column}__std"),
+                "原始最小值": row.get(f"{column}__minraw"),
+                "零值样本数": row.get(f"{column}__zeros"),
                 "高报警样本数": row.get(f"{column}__high"),
                 "高高报警样本数": row.get(f"{column}__high_high"),
             })
@@ -179,18 +182,20 @@ def main() -> None:
             all_long.extend(hourly_long_rows(rows, config, args.include_packing))
 
     output_dir = Path(args.output_dir)
-    temperature_algorithm.write_results(output_dir, all_qc, all_features, all_segments, all_cycles, all_channels, all_observations, all_hf)
+    confirmed_hf, hf_candidates = hf_validation.filter_hf(all_hf)
+    temperature_algorithm.write_results(output_dir, all_qc, all_features, all_segments, all_cycles, all_channels,
+                                         all_observations, confirmed_hf, hf_candidates)
     if not args.no_hourly_long:
         fields = ["机组", "批次", "小时", "点位", "点位描述", "级", "缸", "运行覆盖率",
-                  "均值", "最小值", "最大值", "标准差", "高报警样本数", "高高报警样本数"]
+                  "均值", "最小值", "最大值", "标准差", "原始最小值", "零值样本数", "高报警样本数", "高高报警样本数"]
         temperature_algorithm.write_csv(output_dir / "pks_temperature_hourly.csv", all_long, fields, {field: field for field in fields})
         print(f"温度小时长表:{len(all_long):,} 行 -> {output_dir / 'pks_temperature_hourly.csv'}")
 
     print(f"结果目录:{output_dir}")
-    for level in ("轻微", "异常", "严重"):
+    for level in ("轻微", "异常", "严重异常"):
         print(f"  {level}段:{sum(1 for segment in all_segments if segment['温度阶段'] == level):,}")
     print(f"  观察:{len(all_observations):,}")
-    print(f"  高频波动:{len(all_hf):,}")
+    print(f"  高频候选:{len(hf_candidates):,}  高频确认:{len(confirmed_hf):,}")
     for path in ("温度小时特征.csv", "温度异常段.csv", "温度演化周期.csv", "温度通道质控.csv"):
         print(f"  {path}")
 

+ 185 - 115
_tmp_temperature/unified.py

@@ -4,7 +4,7 @@ One pass over the hourly wide table produces:
 
 * always-on same-stage difference features;
 * short-term (1h/3h/6h) same-stage relative rise/fall;
-* 7#/8#/9# 三级 cross-stage residual (low confidence, long persistence);
+* 7#/8#/9# 三级 high-frequency fluctuation (separate table);
 * independent channel anomalies (shutdown / sudden drop / frozen / dead);
 * confirmed hourly levels, event segments and one evolution-cycle row per
   (run cycle x stage).
@@ -42,9 +42,9 @@ from .config import (
     UnitConfig,
 )
 
-SEV_LABELS = {0: "正常", 1: "观察", 2: "轻微", 3: "异常", 4: "严重"}
-LEVELS = ("观察", "轻微", "异常", "严重")
-EVENT_LEVELS = ("轻微", "异常", "严重")
+SEV_LABELS = {0: "正常", 1: "观察", 2: "轻微", 3: "异常", 4: "严重异常"}
+LEVELS = ("观察", "轻微", "异常", "严重异常")
+EVENT_LEVELS = ("轻微", "异常", "严重异常")
 DIRECTIONS = ("偏高", "偏低", "混合")
 
 
@@ -52,6 +52,20 @@ def _fmt(value, digits=2):
     return "" if value is None else round(float(value), digits)
 
 
+def _part_and_point(label, config: UnitConfig) -> tuple[str, str]:
+    """Derive the fault-table/3D part label and PKS point from a cylinder label."""
+    text = str(label or "").strip()
+    if not text:
+        return "", ""
+    point = next((column for column, name in config.labels.items() if name == text), "")
+    part = text
+    for suffix in ("排气温度", "温度"):
+        if part.endswith(suffix):
+            part = part[: -len(suffix)]
+            break
+    return part, point
+
+
 def _valid(value):
     return value is not None and TEMP_SENSOR_MIN <= value <= TEMP_SENSOR_MAX and value > 0
 
@@ -97,7 +111,7 @@ def _max_candidate(candidates: list[tuple[int, str, str]]):
     candidates = [item for item in candidates if item[0] > 0]
     if not candidates:
         return 0, "", ""
-    return max(candidates, key=lambda item: (item[0], 1 if item[1] in ("level", "tertiary") else 0))
+    return max(candidates, key=lambda item: (item[0], 1 if item[1] == "level" else 0))
 
 
 # ---------------------------------------------------------------------------
@@ -105,7 +119,9 @@ def _max_candidate(candidates: list[tuple[int, str, str]]):
 # ---------------------------------------------------------------------------
 def mark_channel_anomalies(rows: list[dict], config: UnitConfig, thresholds: dict) -> list[dict]:
     ambient = thresholds.get("channel_ambient", 45.0)
-    drop_delta = thresholds.get("channel_drop_delta", 15.0)
+    drop_delta = thresholds.get("channel_drop_delta", 8.0)
+    min_drop = thresholds.get("channel_min_drop", 20.0)
+    zero_min = int(thresholds.get("channel_zero_min", 5))
     recover_hours = int(thresholds.get("channel_recover_hours", 3))
     frozen_hours = int(thresholds.get("channel_frozen_hours", 12))
     frozen_eps = thresholds.get("channel_frozen_eps", 0.1)
@@ -142,6 +158,18 @@ def mark_channel_anomalies(rows: list[dict], config: UnitConfig, thresholds: dic
                 next_values = [item[2] for item in series[position + 1:position + 1 + recover_hours]
                                if item[1] - moment <= timedelta(hours=recover_hours)]
                 recovers = any(value2 >= max(60.0, (reference or 60.0) - 10) for value2 in next_values)
+                minraw = rows[index].get(f"{column}__minraw")
+                zeros = rows[index].get(f"{column}__zeros") or 0
+
+                if minraw is not None and minraw <= ambient and zeros >= zero_min and peak >= 60:
+                    kind = "停机/通道异常" if recovers else "通道坏道"
+                    rows[index][f"{column}__dropout"] = True
+                    anomalies.append(_anomaly_record(config, rows[index], column, kind, minraw, reference))
+                    continue
+                if minraw is not None and reference is not None and minraw < reference - min_drop and recovers and peak >= 60:
+                    rows[index][f"{column}__dropout"] = True
+                    anomalies.append(_anomaly_record(config, rows[index], column, "通道骤降", minraw, reference))
+                    continue
 
                 if value <= ambient and reference is not None and value < reference - 20 and peak >= 60:
                     kind = "停机/通道异常" if recovers else "通道坏道"
@@ -153,6 +181,18 @@ def mark_channel_anomalies(rows: list[dict], config: UnitConfig, thresholds: dic
                         anomalies.append(_anomaly_record(config, rows[index], column, "通道骤降", value, reference))
                     # else: persistent relative low -> keep as process low
 
+            # Rows whose hourly average is entirely empty (all samples 0) are
+            # not in ``series``; still record them from minraw / zero count.
+            for index, row in enumerate(rows):
+                if row.get(f"{column}__dropout"):
+                    continue
+                minraw = row.get(f"{column}__minraw")
+                zeros = row.get(f"{column}__zeros") or 0
+                peak = stage_max[index].get(stage)
+                if minraw is not None and minraw <= ambient and zeros >= zero_min and peak and peak >= 60:
+                    row[f"{column}__dropout"] = True
+                    anomalies.append(_anomaly_record(config, row, column, "停机/通道异常", minraw, None))
+
             # frozen channel: identical for >= N hours while peers vary
             run_start = 0
             for position in range(1, len(series) + 1):
@@ -254,30 +294,6 @@ def _channel_segment(items: list[dict], unit: str, batch: int, column: str) -> d
     }
 
 
-# ---------------------------------------------------------------------------
-# tertiary cross-stage fit
-# ---------------------------------------------------------------------------
-def fit_tertiary(rows: list[dict], config: UnitConfig) -> dict[str, np.ndarray]:
-    if "三级" not in config.stages:
-        return {}
-    t3column = config.stages["三级"][0]
-    first = config.stages.get("一级", [])
-    second = config.stages.get("二级", [])
-    design, target = [], []
-    for row in rows:
-        snap1 = _snapshot(row, first)
-        snap2 = _snapshot(row, second)
-        snap3 = _snapshot(row, [t3column])
-        if not (snap1 and snap2 and snap3):
-            continue
-        design.append([median(snap1[0].values()), median(snap2[0].values()), 1.0])
-        target.append(list(snap3[0].values())[0])
-    if len(design) < 100:
-        return {}
-    coefficient, *_ = np.linalg.lstsq(np.asarray(design), np.asarray(target), rcond=None)
-    return {t3column: coefficient}
-
-
 # ---------------------------------------------------------------------------
 # unified features
 # ---------------------------------------------------------------------------
@@ -285,14 +301,11 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                      thresholds: dict) -> list[dict]:
     valid = list(rows)
     global_spread, global_peer = _global_offsets(valid, config)
-    tertiary = fit_tertiary(valid, config)
-    t3column = config.stages.get("三级", [None])[0] if "三级" in config.stages else None
 
     history: dict[str, deque] = {column: deque() for column in config.columns}
     history_peer: dict[str, deque] = {column: deque() for column in config.columns}
     history_std: dict[str, deque] = {column: deque() for column in config.columns}
     history_spread: dict[str, deque] = {stage: deque() for stage in config.stages}
-    history_resid: deque = deque()
     last_dt: dict[str, datetime | None] = {column: None for column in config.columns}
     rise_count: dict[str, int] = {column: 0 for column in config.columns}
 
@@ -304,8 +317,6 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                        + list(history_std.values()) + list(history_spread.values())):
             while values and values[0][0] < window_start:
                 values.popleft()
-        while history_resid and history_resid[0][0] < window_start:
-            history_resid.popleft()
 
         snapshots = {}
         stage_medians = {}
@@ -361,12 +372,22 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                     log_scale = max(1.4826 * median([abs(value - log_center) for value in log_values]), 0.1)
                     hf_z = (math.log(std_value + 0.01) - log_center) / log_scale
 
+                recent_values = own[-6:]
+                recent_median = median(recent_values) if recent_values else None
+                rise_values = [
+                    item[1] for item in history[column]
+                    if item[0] >= dt - timedelta(hours=thresholds["rise_baseline_hours"])
+                ]
+                rise_base = median(rise_values) if len(rise_values) >= thresholds["rise_min_history_hours"] else None
+                rise_value = value - rise_base if rise_base is not None else None
+
                 per_column[column] = {
                     "value": value, "base": base, "delta": delta, "z": z,
                     "peer_dev": peer_dev, "peer_anom": peer_anom,
                     "d1": change[1], "d3": change[3], "d6": change[6],
                     "slope": slope, "rise": rise_count[column],
                     "std": std_value, "std_base": std_base, "hf_ratio": hf_ratio, "hf_z": hf_z,
+                    "recent_median": recent_median, "rise_base": rise_base, "rise_value": rise_value,
                 }
 
             median_rate = {}
@@ -379,16 +400,6 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                     peer_rate = item[f"d{hours}"] - median_rate[hours] if item[f"d{hours}"] is not None and median_rate[hours] is not None else None
                     item[f"peer_d{hours}"] = peer_rate
 
-            residue = dr3 = None
-            med1 = stage_medians.get("一级")
-            med2 = stage_medians.get("二级")
-            if stage == "三级" and t3column in tertiary and t3column in values and med1 is not None and med2 is not None:
-                coefficient = tertiary[t3column]
-                predicted = coefficient[0] * med1 + coefficient[1] * med2 + coefficient[2]
-                residue = values[t3column] - predicted
-                past = _value_at(history_resid, dt - timedelta(hours=3))
-                dr3 = residue - past if past is not None else None
-
             # ---- grading ----
             deltas = [item["delta"] for item in per_column.values() if item["delta"] is not None]
             zs = [item["z"] for item in per_column.values() if item["z"] is not None]
@@ -398,10 +409,14 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                             if item["peer_anom"] is not None), default=0.0)
             peer_low = abs(min(0.0, min_peer))
             rate_max = {hours: max((item[f"peer_d{hours}"] for item in per_column.values()
-                                    if item[f"peer_d{hours}"] is not None), default=None)
+                                    if item[f"peer_d{hours}"] is not None
+                                    and item["recent_median"] is not None
+                                    and item["value"] > item["recent_median"]), default=None)
                         for hours in (1, 3, 6)}
             rate_min = {hours: min((item[f"peer_d{hours}"] for item in per_column.values()
-                                    if item[f"peer_d{hours}"] is not None), default=None)
+                                    if item[f"peer_d{hours}"] is not None
+                                    and item["recent_median"] is not None
+                                    and item["value"] < item["recent_median"]), default=None)
                         for hours in (1, 3, 6)}
 
             # A drop followed by a rebound (or a rise followed by a fall) is a
@@ -446,6 +461,55 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 elif hf_z is not None:
                     hf_reason = f"{label}高频波动z={hf_z:.1f}"
 
+            rise_values = [item["rise_value"] for item in per_column.values() if item["rise_value"] is not None]
+            stage_rise = median(rise_values) if rise_values else None
+            relative_rises = {
+                column: item["rise_value"] - stage_rise
+                for column, item in per_column.items()
+                if item["rise_value"] is not None and stage_rise is not None
+            }
+            if len(values) >= 2:
+                rise_single_column = max(relative_rises, key=relative_rises.get, default=None)
+                rise_single = relative_rises[rise_single_column] if rise_single_column else None
+                rise_stage_value = stage_rise
+            else:
+                rise_single_column = max(
+                    (column for column in per_column if per_column[column]["rise_value"] is not None),
+                    key=lambda column: per_column[column]["rise_value"], default=None)
+                rise_single = per_column[rise_single_column]["rise_value"] if rise_single_column else None
+                rise_stage_value = rise_single
+
+            previous_values = []
+            for column in per_column:
+                previous = _value_at(history[column], dt - timedelta(hours=1))
+                if previous is not None:
+                    previous_values.append(previous)
+            previous_stage_median = median(previous_values) if previous_values else None
+            stage_rising = previous_stage_median is not None and stage_median > previous_stage_median
+            rise_flat = stage_rise is not None and abs(stage_rise) <= thresholds["rise_stage_flat_limit"]
+
+            # Only a single-cylinder rise *relative to its stage peers* is a
+            # fault candidate.  A whole-stage rise is the normal daily load
+            # ramp; it is kept as a feature, not an event.
+            if len(values) >= 2:
+                rise_single_sev = _sev_level(
+                    rise_single, thresholds["rise_single_mild"], thresholds["rise_single_abnormal"], thresholds["rise_single_severe"]
+                ) if (stage_rising and rise_flat) else 0
+                rise_sev = rise_single_sev
+                if rise_sev:
+                    rise_type = "单缸抬升"
+                    rise_label = config.labels.get(rise_single_column, "") if rise_single_column else ""
+                    rise_reason = f"6h整级抬升{rise_stage_value:+.1f}℃;{rise_label}相对同级{rise_single:+.1f}℃"
+                else:
+                    rise_type = ""
+                    rise_label = ""
+                    rise_reason = ""
+            else:
+                rise_sev = 0
+                rise_type = ""
+                rise_label = ""
+                rise_reason = ""
+
             def peer_reason(column, anomaly, sign):
                 if column is None or anomaly is None:
                     return ""
@@ -485,16 +549,12 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 high_sev, high_source, high_reason = _max_candidate(high_candidates)
                 low_sev, low_source, low_reason = _max_candidate(low_candidates)
             else:
-                if residue is not None:
-                    high_sev = _sev_level(residue, thresholds["mild_resid3"], thresholds["abnormal_resid3"], thresholds["severe_resid3"])
-                    low_sev = _sev_level(-residue, thresholds["mild_resid3"], thresholds["abnormal_resid3"], thresholds["severe_resid3"])
-                    high_source = low_source = "tertiary"
-                    high_reason = f"三级残差+{residue:.1f}℃"
-                    low_reason = f"三级残差{residue:.1f}℃"
-                else:
-                    high_sev = low_sev = 0
-                    high_source = low_source = ""
-                    high_reason = low_reason = ""
+                # Single-cylinder stage: no same-stage peers.  The old
+                # cross-stage residual feature is intentionally removed; only
+                # high-frequency fluctuation is kept for the tertiary stage.
+                high_sev = low_sev = 0
+                high_source = low_source = ""
+                high_reason = low_reason = ""
 
             if high_sev and low_sev:
                 base_direction, base_severity, base_source = "混合", max(high_sev, low_sev), "混合"
@@ -507,13 +567,15 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 base_direction, base_severity, base_source, base_reason = "", 0, "", ""
 
             direction, severity, source, reason = base_direction, base_severity, base_source, base_reason
+            if base_severity == 0 and rise_sev > 0:
+                direction, severity, source, reason = "偏高", rise_sev, "rise", rise_reason
 
             if severity == 0:
                 feature_type = ""
             elif source == "hf":
                 feature_type = "高频波动"
-            elif source == "tertiary":
-                feature_type = f"三级相对{direction}" if direction in ("偏高", "偏低") else "三级相对混合"
+            elif source == "rise":
+                feature_type = rise_type
             elif direction == "混合":
                 feature_type = "混合"
             elif source == "short":
@@ -521,7 +583,7 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
             else:
                 feature_type = "持续偏高" if direction == "偏高" else "持续偏低"
 
-            confidence = "低" if source == "tertiary" else ("高" if source == "level" else "中")
+            confidence = "高" if source == "level" else "中"
 
             strongest = max((column for column in per_column if per_column[column]["delta"] is not None),
                             key=lambda column: per_column[column]["delta"], default=None)
@@ -556,6 +618,12 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 "高频标准差": _fmt(hf_std),
                 "高频基线标准差": _fmt(hf_base),
                 "高频波动缸": config.labels.get(hf_column, "") if hf_column else "",
+                "6小时整级抬升": _fmt(rise_stage_value),
+                "6小时单缸抬升": _fmt(rise_single),
+                "6小时单缸相对抬升": _fmt(relative_rises.get(rise_single_column)) if rise_single_column else "",
+                "6小时基线": _fmt(per_column[rise_single_column]["rise_base"]) if rise_single_column else "",
+                "抬升类型": rise_type,
+                "抬升缸": rise_label,
                 "最强缸": config.labels.get(strongest, "") if strongest else "",
                 "最高报警阈值": _fmt(min(high_values)) if high_values else "",
                 "高高报警阈值": _fmt(min(high_high_values)) if high_high_values else "",
@@ -574,8 +642,6 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 "同级相对1h": _fmt(rate_max[1] if rate_max[1] is not None and (rate_max[1] or 0) >= (abs(rate_min[1] or 0)) else rate_min[1]),
                 "同级相对3h": _fmt(rate_max[3] if rate_max[3] is not None and (rate_max[3] or 0) >= (abs(rate_min[3] or 0)) else rate_min[3]),
                 "同级相对6h": _fmt(rate_max[6] if rate_max[6] is not None and (rate_max[6] or 0) >= (abs(rate_min[6] or 0)) else rate_min[6]),
-                "三级残差": _fmt(residue),
-                "三级残差3h": _fmt(dr3),
                 "各缸温度": ";".join(f"{config.labels.get(column, column)}={value:.2f}" for column, value in values.items()),
                 "各缸自身偏离": ";".join(f"{config.labels.get(column, column)}={per_column[column]['delta']:+.2f}"
                                           for column in values if per_column[column]["delta"] is not None),
@@ -601,13 +667,14 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 "_hf_std": hf_std,
                 "_hf_base": hf_base,
                 "_hf_column": hf_column,
+                "_rise_sev": rise_sev,
+                "_rise_type": rise_type,
+                "_rise_stage": rise_stage_value,
+                "_rise_single": rise_single,
                 "_type": feature_type,
                 "_confidence": confidence,
                 "_dt": dt,
                 "_strongest": strongest,
-                "_tertiary": residue is not None,
-                "_med1": med1 if stage == "三级" else None,
-                "_med2": med2 if stage == "三级" else None,
             })
 
             # append histories after all computations for this stage
@@ -618,8 +685,6 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
                 last_dt[column] = dt
             if spread is not None:
                 history_spread[stage].append((dt, spread))
-            if residue is not None:
-                history_resid.append((dt, residue))
 
     return features
 
@@ -630,8 +695,8 @@ def compute_features(rows: list[dict], config: UnitConfig, bad_channels: set[str
 def confirm_levels(features: list[dict], thresholds: dict) -> None:
     confirm_hours = int(thresholds.get("confirm_hours", 3))
     event_hours = int(thresholds.get("event_hours", 2))
-    tertiary_persist = int(thresholds.get("resid3_persist_hours", 6))
     hf_persist = int(thresholds.get("hf_persist_hours", 3))
+    rise_persist = int(thresholds.get("rise_persist_hours", 2))
     grouped: dict[tuple, list[dict]] = defaultdict(list)
     for row in features:
         grouped[(row["机组"], row["批次"], row["级"])].append(row)
@@ -655,8 +720,8 @@ def confirm_levels(features: list[dict], thresholds: dict) -> None:
 
             level_rows = [row for row in run if row["_source"] == "level" and row["_raw_sev"] > 0]
             short_rows = [row for row in run if row["_source"] == "short" and row["_raw_sev"] > 0]
-            tertiary_rows = [row for row in run if row["_source"] == "tertiary" and row["_raw_sev"] > 0]
             hf_rows = [row for row in run if row["_source"] == "hf" and row["_raw_sev"] > 0]
+            rise_rows = [row for row in run if row["_source"] == "rise" and row["_raw_sev"] > 0]
             max_level = max((row["_raw_sev"] for row in level_rows), default=0)
             max_short = max((row["_raw_sev"] for row in short_rows), default=0)
             strong_short = [row for row in short_rows if row["_raw_sev"] >= 2]
@@ -669,9 +734,10 @@ def confirm_levels(features: list[dict], thresholds: dict) -> None:
                     short_streak = 1
                 previous_direction = row["_direction"]
                 best_short_streak = max(best_short_streak, short_streak)
-            max_tertiary = max((row["_raw_sev"] for row in tertiary_rows), default=0)
             max_hf = max((row["_raw_sev"] for row in hf_rows), default=0)
             strong_hf = [row for row in hf_rows if row["_raw_sev"] >= 2]
+            max_rise = max((row["_raw_sev"] for row in rise_rows), default=0)
+            strong_rise = [row for row in rise_rows if row["_raw_sev"] >= 2]
 
             final = 0
             if max_level:
@@ -686,17 +752,14 @@ def confirm_levels(features: list[dict], thresholds: dict) -> None:
                     final = max(final, 1)
             if max_short >= 2 and best_short_streak >= 2:
                 final = max(final, max_short)
-            if max_tertiary:
-                if run_length >= tertiary_persist:
-                    final = max(final, max_tertiary)
-                else:
-                    final = max(final, 1)
             if max_hf >= 2 and len(strong_hf) >= hf_persist:
                 final = max(final, max_hf)
+            if max_rise >= 2 and len(strong_rise) >= rise_persist:
+                final = max(final, max_rise)
             if final == 0:
                 final = 1
 
-            peak = max(run, key=lambda row: (row["_raw_sev"], 1 if row["_source"] in ("level", "tertiary") else 0))
+            peak = max(run, key=lambda row: (row["_raw_sev"], 1 if row["_source"] == "level" else 0))
             active_directions = {row["_direction"] for row in run if row["_direction"] and row["_raw_sev"] >= 2}
             if "混合" in active_directions or len(active_directions) > 1:
                 direction = "混合"
@@ -706,7 +769,7 @@ def confirm_levels(features: list[dict], thresholds: dict) -> None:
             first_short = next((row["小时"] for row in run
                                 if row["_source"] == "short" and row["_raw_sev"] >= 2), "")
             first_level = next((row["小时"] for row in run
-                                if row["_source"] in ("level", "tertiary") and row["_raw_sev"] >= 2), "")
+                                if row["_source"] in ("level", "rise") and row["_raw_sev"] >= 2), "")
             for row in run:
                 row["温度等级"] = SEV_LABELS[final]
                 row["是否事件"] = "是" if final >= 2 else "否"
@@ -773,19 +836,20 @@ def build_segments(features: list[dict], config: UnitConfig, channel_segments: l
             if not current or row["_dt"] - current[-1]["_dt"] <= timedelta(hours=thresholds.get("merge_gap_hours", 6)):
                 current.append(row)
             else:
-                segments.append(_build_segment(current, unit, batch, stage, level, channel_by_key))
+                segments.append(_build_segment(current, unit, batch, stage, level, channel_by_key, config))
                 current = [row]
         if current:
-            segments.append(_build_segment(current, unit, batch, stage, level, channel_by_key))
+            segments.append(_build_segment(current, unit, batch, stage, level, channel_by_key, config))
 
     segments = [segment for segment in segments if segment["有效运行小时数"] >= min_hours]
     return sorted(segments, key=output_sort_key)
 
 
 def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: str,
-                   channel_by_key: dict) -> dict:
+                   channel_by_key: dict, config: UnitConfig) -> dict:
     first, last = rows[0], rows[-1]
-    peak = max(rows, key=lambda row: (row["_raw_sev"], 1 if row["_source"] in ("level", "tertiary") else 0))
+    peak = max(rows, key=lambda row: (row["_raw_sev"], 1 if row["_source"] == "level" else 0))
+    peak_label = peak.get("最强缸") or peak.get("最高温度缸") or ""
     spread_rows = [row for row in rows if row["级差"] not in ("", None)]
     spread_peak = max(spread_rows, key=lambda row: row["级差"]) if spread_rows else None
     peer_rows = [row for row in rows if row["最大同级偏离"] not in ("", None)]
@@ -793,7 +857,7 @@ def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: s
     low_rows = [row for row in rows if row["最大同级偏低"] not in ("", None)]
     low_peak = max(low_rows, key=lambda row: row["最大同级偏低"]) if low_rows else None
     short_times = [row["小时"] for row in rows if row["_source"] == "short" and row["_raw_sev"] >= 2]
-    level_times = [row["小时"] for row in rows if row["_source"] in ("level", "tertiary") and row["_raw_sev"] >= 2]
+    level_times = [row["小时"] for row in rows if row["_source"] == "level" and row["_raw_sev"] >= 2]
     directions = {row["方向"] for row in rows if row["方向"]}
     direction = "混合" if "混合" in directions or len(directions) > 1 else (next(iter(directions), ""))
     return {
@@ -802,7 +866,10 @@ def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: s
         "周期编号": first["周期编号"],
         "级": stage,
         "温度阶段": level,
-        "是否事件": "是" if level in ("轻微", "异常", "严重") else "否",
+        "阶段部位": _part_and_point(peak_label, config)[0],
+        "阶段点位": _part_and_point(peak_label, config)[1],
+        "是否事件": "是" if level in EVENT_LEVELS else "否",
+        "是否形成确认等级": "是" if level in ("异常", "严重异常") else "否",
         "方向": direction or peak["_direction"],
         "特征类型": "混合" if direction == "混合" else peak["_type"],
         "置信度": peak["_confidence"],
@@ -811,7 +878,7 @@ def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: s
         "持续自然小时数": int((last["_dt"] - first["_dt"]).total_seconds() / 3600) + 1,
         "有效运行小时数": len(rows),
         "峰值时刻": peak["小时"],
-        "峰值缸": peak["最强缸"],
+        "峰值缸": peak_label,
         "最高温度": max((row["最高温度"] for row in rows if row["最高温度"] not in ("", None)), default=""),
         "最大自身偏离": peak["最大自身偏离"],
         "最大级差": spread_peak["级差"] if spread_peak else "",
@@ -827,6 +894,8 @@ def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: s
         "首次持续触发": min(level_times) if level_times else "",
         "阶段最高报警阈值": min((row["最高报警阈值"] for row in rows if row["最高报警阈值"] not in ("", None)), default=""),
         "阶段高高报警阈值": min((row["高高报警阈值"] for row in rows if row["高高报警阈值"] not in ("", None)), default=""),
+        "阶段高报警小时数": sum(1 for row in rows if row.get("超告警缸") not in ("", None)),
+        "阶段高高报警小时数": sum(1 for row in rows if row.get("超高高缸") not in ("", None)),
         "关联通道异常": "、".join(sorted(channel_by_key.get((unit, stage), set()))),
         "阶段触发依据": ";".join(
             list(dict.fromkeys(
@@ -840,6 +909,7 @@ def _build_segment(rows: list[dict], unit: str, batch: int, stage: str, level: s
 def build_hf_segments(features: list[dict], config: UnitConfig, thresholds: dict) -> list[dict]:
     """High-frequency fluctuation events, tertiary stage only."""
     hf_persist = int(thresholds.get("hf_persist_hours", 3))
+    rise_persist = int(thresholds.get("rise_persist_hours", 2))
     grouped: dict[tuple, list[dict]] = defaultdict(list)
     for row in features:
         if row["级"] != "三级" or row.get("_hf_sev", 0) <= 0:
@@ -897,7 +967,10 @@ def _build_hf_segment(rows: list[dict], unit: str, batch: int, stage: str, confi
         "周期编号": rows[0]["周期编号"],
         "级": stage,
         "温度阶段": SEV_LABELS[level],
+        "阶段部位": _part_and_point(label, config)[0],
+        "阶段点位": _part_and_point(label, config)[1],
         "是否事件": "是",
+        "是否形成确认等级": "是" if SEV_LABELS[level] in ("异常", "严重异常") else "否",
         "方向": "波动",
         "特征类型": "高频波动",
         "置信度": "中",
@@ -938,7 +1011,7 @@ def summarize_cycles(features: list[dict], segments: list[dict], config: UnitCon
                 previous = label
         if len(sequence) > 1 and sequence[-1] == "正常":
             sequence[-1] = "恢复"
-        peak = max(rows, key=lambda row: (row["_raw_sev"], 1 if row["_source"] in ("level", "tertiary") else 0))
+        peak = max(rows, key=lambda row: (row["_raw_sev"], 1 if row["_source"] == "level" else 0))
         summary = {
             "机组": unit,
             "批次": batch,
@@ -981,28 +1054,33 @@ FEATURE_FIELDS = [
     "级差", "级差基线", "级差变化",
     "最大自身偏离", "最大自身偏离缸", "最大同级偏离", "最大同级偏离缸",
     "最大同级偏低", "最大同级偏低缸", "最大稳健z",
-    "高频波动倍数", "高频波动z", "高频标准差", "高频基线标准差", "高频波动缸", "最强缸",
+    "高频波动倍数", "高频波动z", "高频标准差", "高频基线标准差", "高频波动缸",
+    "6小时整级抬升", "6小时单缸抬升", "6小时单缸相对抬升", "6小时基线", "抬升类型", "抬升缸", "最强缸",
     "近6小时斜率", "连续上升小时数", "同级相对1h", "同级相对3h", "同级相对6h",
-    "三级残差", "三级残差3h",
     "各缸温度", "各缸自身偏离", "各缸同级偏离",
     "方向", "特征类型", "来源", "置信度",
     "温度等级", "原始等级", "是否事件", "首次短时触发", "首次持续触发", "关联通道异常", "判定依据",
 ]
 
-SEGMENT_FIELDS = [
-    "机组", "批次", "周期编号", "级", "温度阶段", "是否事件", "方向", "特征类型", "置信度",
-    "开始小时", "结束小时", "持续自然小时数", "有效运行小时数", "峰值时刻", "峰值缸", "最高温度",
-    "最大自身偏离", "最大级差", "最大级差基线", "最大级差变化", "最大同级偏离", "最大同级偏低", "最大稳健z",
+CANONICAL_FIELDS = [
+    "机组", "批次", "周期编号", "级", "温度阶段", "阶段部位", "阶段点位",
+    "开始小时", "结束小时", "持续自然小时数", "有效运行小时数",
+    "峰值时刻", "峰值缸", "最高温度",
+    "最大自身偏离", "最大级差", "最大级差基线", "最大级差变化",
+    "最大同级偏离", "最大同级偏低", "最大稳健z",
     "最大同级相对1h", "最大同级相对3h", "最大同级相对6h",
     "首次短时触发", "首次持续触发",
-    "阶段最高报警阈值", "阶段高高报警阈值", "关联通道异常", "阶段触发依据",
+    "阶段最高报警阈值", "阶段高高报警阈值",
+    "阶段高报警小时数", "阶段高高报警小时数",
+    "方向", "特征类型", "置信度",
+    "高频波动倍数", "高频波动z", "高频标准差", "高频基线标准差", "高频波动缸",
+    "去趋势残差标准差", "每小时反复升降次数",
+    "是否形成确认等级", "关联通道异常", "阶段触发依据",
 ]
 
-HF_FIELDS = [
-    "机组", "批次", "周期编号", "级", "温度阶段", "是否事件", "方向", "特征类型", "置信度",
-    "开始小时", "结束小时", "持续自然小时数", "有效运行小时数", "峰值时刻", "峰值缸", "最高温度",
-    "高频波动倍数", "高频波动z", "高频标准差", "高频基线标准差", "高频波动缸", "阶段触发依据",
-]
+SEGMENT_FIELDS = CANONICAL_FIELDS
+HF_FIELDS = CANONICAL_FIELDS
+HF_CANDIDATE_FIELDS = CANONICAL_FIELDS + ["是否确认"]
 
 CYCLE_FIELDS = [
     "机组", "批次", "周期编号", "级", "周期开始小时", "周期结束小时", "有效运行小时数",
@@ -1011,7 +1089,7 @@ CYCLE_FIELDS = [
     "观察阶段开始小时", "观察阶段结束小时", "观察阶段运行小时数", "是否达到观察",
     "轻微阶段开始小时", "轻微阶段结束小时", "轻微阶段运行小时数", "是否达到轻微",
     "异常阶段开始小时", "异常阶段结束小时", "异常阶段运行小时数", "是否达到异常",
-    "严重阶段开始小时", "严重阶段结束小时", "严重阶段运行小时数", "是否达到严重",
+    "严重异常阶段开始小时", "严重异常阶段结束小时", "严重异常阶段运行小时数", "是否达到严重异常",
     "周期最高温度", "周期最大级差", "周期最大级差变化", "周期最大同级偏离", "周期最大同级偏低",
 ]
 
@@ -1044,18 +1122,20 @@ OBSERVATION_FIELDS = [
     "判定依据", "关联周期编号", "关联事件开始", "关联事件等级", "是否升级为事件",
 ]
 
-TERTIARY_FIELDS = [
-    "机组", "批次", "周期编号", "小时", "三级温度", "一级中位", "二级中位",
-    "三级残差", "三级残差3h", "温度等级", "方向", "判定依据",
-]
 
 
-def write_results(output_dir, qc, features, segments, cycles, channel_segments, observations, hf_segments):
+def write_results(output_dir, qc, features, segments, cycles, channel_segments, observations,
+                  hf_segments, hf_candidates=None):
     output_dir.mkdir(parents=True, exist_ok=True)
+    candidates = hf_candidates if hf_candidates is not None else hf_segments
+    canonical = clean_rows(segments) + clean_rows(hf_segments)
+    canonical.sort(key=output_sort_key)
+    canonical_hf = [row for row in canonical if row.get("特征类型") == "高频波动"]
     write_csv(output_dir / "温度小时特征.csv", clean_rows(features), FEATURE_FIELDS, {field: field for field in FEATURE_FIELDS})
-    write_csv(output_dir / "温度异常段.csv", clean_rows(segments), SEGMENT_FIELDS, {field: field for field in SEGMENT_FIELDS})
+    write_csv(output_dir / "温度异常段.csv", canonical, CANONICAL_FIELDS, {field: field for field in CANONICAL_FIELDS})
     write_csv(output_dir / "温度观察段.csv", clean_rows(observations), OBSERVATION_FIELDS, {field: field for field in OBSERVATION_FIELDS})
-    write_csv(output_dir / "温度高频波动段.csv", clean_rows(hf_segments), HF_FIELDS, {field: field for field in HF_FIELDS})
+    write_csv(output_dir / "温度高频波动段.csv", canonical_hf, HF_FIELDS, {field: field for field in HF_FIELDS})
+    write_csv(output_dir / "温度高频候选.csv", clean_rows(candidates), HF_CANDIDATE_FIELDS, {field: field for field in HF_CANDIDATE_FIELDS})
     write_csv(output_dir / "温度演化周期.csv", clean_rows(cycles), CYCLE_FIELDS, {field: field for field in CYCLE_FIELDS})
     write_csv(output_dir / "温度通道异常段.csv", clean_rows(channel_segments), CHANNEL_FIELDS, {field: field for field in CHANNEL_FIELDS})
     write_csv(output_dir / "温度通道质控.csv", clean_rows(qc), QC_FIELDS, {field: field for field in QC_FIELDS})
@@ -1064,16 +1144,6 @@ def write_results(output_dir, qc, features, segments, cycles, channel_segments,
     write_csv(output_dir / "同级温差特征.csv", clean_rows(same_stage), SAME_STAGE_FIELDS, {field: field for field in SAME_STAGE_FIELDS})
     short = [{**row} for row in features]
     write_csv(output_dir / "温度短时特征.csv", clean_rows(short), SHORT_FIELDS, {field: field for field in SHORT_FIELDS})
-    tertiary = [
-        {
-            "机组": row["机组"], "批次": row["批次"], "周期编号": row["周期编号"], "小时": row["小时"],
-            "三级温度": row["最高温度"], "一级中位": _fmt(row.get("_med1")), "二级中位": _fmt(row.get("_med2")),
-            "三级残差": row["三级残差"], "三级残差3h": row["三级残差3h"],
-            "温度等级": row["温度等级"], "方向": row["方向"], "判定依据": row["判定依据"],
-        }
-        for row in features if row["级"] == "三级"
-    ]
-    write_csv(output_dir / "温度三级特征.csv", clean_rows(tertiary), TERTIARY_FIELDS, {field: field for field in TERTIARY_FIELDS})
 
 
 def run(rows: list[dict], config: UnitConfig, thresholds: dict | None = None, min_hours: int = 1):

+ 148 - 0
_tmp_temperature/温度异常段_字段说明.md

@@ -0,0 +1,148 @@
+# 温度异常段输出字段说明(v1 符合性改造)
+
+> 本文件记录 `_tmp_temperature/out/温度异常段.csv` 的**输出契约**。
+> 本次完成字段/等级/高频合并,并增加高频候选的 5 秒二次确认;
+> 未改温度事件判定和基线计算,未迁移到 `models/`、未训练模型、未接入 viewer。
+
+## 1. 文件定位
+
+| 项目 | 说明 |
+|---|---|
+| 文件 | `_tmp_temperature/out/温度异常段.csv` |
+| 粒度 | 一行一个阶段段(温度事件或高频波动) |
+| 当前行数 | 96 行 = 49 条温度事件 + 47 条已确认高频波动 |
+| 高频候选 | `温度高频候选.csv` 保留首轮 60 行及是否确认 |
+| 过滤副本 | `温度高频波动段.csv` 为确认后的 47 行 |
+| 不进入本表 | `温度观察段.csv`、`温度过渡段.csv`、`温度通道异常段.csv` |
+
+`温度过渡段.csv` 只保留为独立 CSV,不进入页面、确认事件或后续故障表。
+
+## 2. 等级与确认
+
+- `温度阶段` 取值固定为:`轻微`、`异常`、`严重异常`。
+- `是否形成确认等级`:
+  - `轻微` → `否`
+  - `异常` / `严重异常` → `是`
+- 原输出中的 `是否事件` 已删除;事件/观察的区分由所在文件和 `特征类型` 表达。
+
+## 3. 字段契约
+
+| 字段 | 含义 | 取值 / 单位 |
+|---|---|---|
+| `机组` | 机组 | `4号机` ~ `9号机` |
+| `批次` | PKS 导入批次 | 整数 |
+| `周期编号` | 运行周期编号 | 字符串 |
+| `级` | 温度级 | `一级` / `二级` / `三级` |
+| `温度阶段` | 阶段等级 | `轻微` / `异常` / `严重异常` |
+| `阶段部位` | 故障部位标签 | 如 `一级2#缸`、`三级1列缸` |
+| `阶段点位` | 故障点位 | 如 `YSJ_20`、`YSJ_21` |
+| `开始小时` | 阶段开始 | `YYYY-MM-DD HH:MM:SS` |
+| `结束小时` | 阶段结束 | `YYYY-MM-DD HH:MM:SS` |
+| `持续自然小时数` | 自然持续小时 | 小时 |
+| `有效运行小时数` | 段内有效运行小时 | 小时 |
+| `峰值时刻` | 段内峰值小时 | 时间 |
+| `峰值缸` | 峰值缸/列标签 | 如 `一级2#缸排气温度` |
+| `最高温度` | 段内最高温度 | ℃ |
+| `最大自身偏离` | 相对自身历史基线的最大偏离 | ℃ |
+| `最大级差` | 段内最大级差 | ℃ |
+| `最大级差基线` | 级差基线(现有算法值) | ℃ |
+| `最大级差变化` | 级差相对基线的变化 | ℃ |
+| `最大同级偏离` | 相对同级中位的最大偏高 | ℃ |
+| `最大同级偏低` | 相对同级中位的最大偏低 | ℃ |
+| `最大稳健z` | 最大稳健 z | 无量纲 |
+| `最大同级相对1h` | 1h 同级相对变化最大值 | ℃ |
+| `最大同级相对3h` | 3h 同级相对变化最大值 | ℃ |
+| `最大同级相对6h` | 6h 同级相对变化最大值 | ℃ |
+| `首次短时触发` | 首次短时触发时刻 | 时间 |
+| `首次持续触发` | 首次持续触发时刻 | 时间 |
+| `阶段最高报警阈值` | 段内高报阈值最小值 | ℃ |
+| `阶段高高报警阈值` | 段内高高报阈值最小值 | ℃ |
+| `阶段高报警小时数` | 段内出现高报的小时数 | 小时 |
+| `阶段高高报警小时数` | 段内出现高高报的小时数 | 小时 |
+| `方向` | 方向 | `偏高` / `偏低` / `混合` / `波动` |
+| `特征类型` | 特征类型 | `持续偏高` / `持续偏低` / `混合` / `单缸抬升` / `高频波动` |
+| `置信度` | 置信度 | `高` / `中` / `低` |
+| `高频波动倍数` | HF 倍数(仅 HF 行) | 倍 |
+| `高频波动z` | HF 稳健 z(仅 HF 行) | 无量纲 |
+| `高频标准差` | 原始小时标准差(仅 HF 行) | ℃ |
+| `高频基线标准差` | 原始基线标准差(仅 HF 行) | ℃ |
+| `高频波动缸` | HF 波动缸/列(仅 HF 行) | 标签 |
+| `去趋势残差标准差` | 去 10 分钟慢趋势后的残差标准差(仅 HF 行) | ℃ |
+| `每小时反复升降次数` | 去趋势后短周期峰谷反转次数/小时(仅 HF 行) | 次/小时 |
+| `是否形成确认等级` | 是否达到确认等级 | `是` / `否` |
+| `关联通道异常` | 关联通道异常类型 | 诊断字段,页面不显示 |
+| `阶段触发依据` | 人类可读触发依据 | 字符串 |
+
+## 4. 基线说明
+
+本次**没有改基线算法**:
+
+- `最大级差基线` 仍是现有算法输出的级差基线;
+- `温度异常段.csv` 不新增/重算“温度基线”或“正常波动带”;
+- 后续 viewer 如需显示基线,只能使用现有字段(如 `最大级差基线`)或等迁移阶段再定义。
+
+## 5. 故障表映射(本次只记录,不实施)
+
+未来写入 `compressor_alarm` 时建议:
+
+| 故障表字段 | 温度来源 |
+|---|---|
+| `device_code` | `机组` → `4#` ~ `9#` |
+| `device_part` | `阶段部位` |
+| `device_point` | `阶段点位` |
+| `alarm_type` | 固定 `温度故障` |
+| `alarm_level` | `温度阶段` |
+| `alarm_des` | `阶段触发依据` |
+| `alarm_time_start` | `开始小时` |
+| `alarm_time_end` | `结束小时` |
+| `alarm_info_json` | 整行 JSON |
+
+高频波动行同样进入故障表,`特征类型=高频波动`;`阶段点位` 由 `高频波动缸` 推导。`温度高频候选.csv` 中 `是否确认=否` 的 13 行不进入故障表。
+
+## 6. 页面适配
+
+- 页面只读 `温度异常段.csv`;
+- `特征类型=高频波动` 的行显示为“高频波动”,其余显示为“温度事件”;
+- `温度高频波动段.csv` 不再被页面重复读取;
+- 总数为 96 条;`温度高频候选.csv` 不进入页面。
+
+## 7. 高频确认规则
+
+- 首轮候选仍用原始小时标准差筛出,保留在 `温度高频候选.csv`;
+- 二次确认用 5 秒原始数据:
+  - 先减去 10 分钟滚动中位数,得到去趋势残差;
+  - 计算残差标准差;
+  - 统计去趋势后短周期峰谷反转次数/小时;
+- 确认条件:`去趋势残差标准差 ≥ 0.5℃` 且 `反复升降 ≥ 5 次/小时`,并满足持续 ≥3h;
+- 当前 60 条候选确认 47 条;未确认 13 条留在候选表,不进入 `温度异常段.csv`。
+
+## 8. 本次不做 / 后续阶段
+
+本次不做:
+
+- 不改温度事件判定和基线逻辑;仅新增高频候选的 5 秒二次确认;
+- 不迁移 `models/`;
+- 不训练模型;
+- 不写 `compressor_alarm`;
+- 不做 viewer/3D 映射。
+
+后续阶段:
+
+1. 将 `_tmp_temperature` 的规则算法迁入 `models/temperature/`;
+2. 建立 `models/datas/reference/温度异常段.csv` 和 `models/results/temperature/`;
+3. `alarm_store` 增加 `温度故障`,接入 `scan_all` / `realtime_service`;
+4. viewer 增加温度告警详情、温度曲线和 `YSJ_xx` → 3D 部件映射;
+5. 如确认需要,再训练温度模型并接入 `model_predict`。
+
+## 9. 校验清单
+
+- `温度异常段.csv` = 96 行;
+- 温度事件 = 49 行;已确认高频波动 = 47 行;高频候选 = 60 行;
+- `温度阶段` 不含 `严重`;
+- 不含 `是否事件` 列;
+- 每行 `阶段部位`、`阶段点位` 非空;
+- `轻微` 行的 `是否形成确认等级=否`;
+- `异常` / `严重异常` 行的 `是否形成确认等级=是`;
+- `温度高频波动段.csv` 是 `温度异常段.csv` 的 47 行过滤副本;
+- `温度高频候选.csv` 保留 60 行,`是否确认` 标出确认结果;
+- 页面总数 96,回测 11/12。

+ 44 - 121
backend/app/services/temperature_transition_service.py

@@ -1,6 +1,6 @@
-"""Temperature transition waveform data for the review page.
+"""Temperature event waveform data for the review page.
 
-The labels come from ``_tmp_temperature/out/温度过渡段.csv``; the waveform is
+The labels come from ``_tmp_temperature/out/温度异常段.csv``; the waveform is
 queried live from ``pks_long_sample`` at 5-second resolution.
 """
 from __future__ import annotations
@@ -16,10 +16,8 @@ from typing import Any
 from ..db import get_connection
 
 ROOT = Path(__file__).resolve().parents[3]
-LABELS_CSV = ROOT / "_tmp_temperature" / "out" / "温度过渡段.csv"
 TEMPERATURE_EVENTS_CSV = ROOT / "_tmp_temperature" / "out" / "温度异常段.csv"
 TEMPERATURE_OBS_CSV = ROOT / "_tmp_temperature" / "out" / "温度观察段.csv"
-TEMPERATURE_HF_CSV = ROOT / "_tmp_temperature" / "out" / "温度高频波动段.csv"
 STEP_SECONDS = 5
 PAD_HOURS = 6
 
@@ -170,7 +168,7 @@ def _event_matches(unit: str, stage: str, start: datetime, end: datetime,
                    event_rows: list[dict[str, str]]) -> list[str]:
     matches = []
     for row in event_rows:
-        if (row.get("是否事件") or "") != "是":
+        if (row.get("特征类型") or "") == "高频波动":
             continue
         if (row.get("机组") or "") != unit or (row.get("级") or "") != stage:
             continue
@@ -208,24 +206,22 @@ def _observation_matches(unit: str, stage: str, start: datetime, end: datetime,
 def _labels() -> list[dict[str, Any]]:
     event_rows = _read_csv(TEMPERATURE_EVENTS_CSV)
     observation_rows = _read_csv(TEMPERATURE_OBS_CSV)
-    transition_rows = _read_csv(LABELS_CSV)
     faults = _load_faults()
 
     items: list[dict[str, Any]] = []
     for index, row in enumerate(event_rows):
-        if (row.get("是否事件") or "") != "是":
-            continue
         unit = (row.get("机组") or "").strip()
         start_text = row.get("开始小时") or ""
         end_text = row.get("结束小时") or ""
         level = row.get("温度阶段") or ""
         feature = row.get("特征类型") or ""
         grade = row.get("级") or ""
+        is_hf = feature == "高频波动"
         items.append({
             "key": f"event:{index}",
             "title": f"{unit}-{grade}-{level}-{feature}-{start_text[:16]}",
-            "kind": "temperature_event",
-            "kindLabel": "温度事件",
+            "kind": "temperature_hf" if is_hf else "temperature_event",
+            "kindLabel": "高频波动" if is_hf else "温度事件",
             "device": unit,
             "deviceCode": f"{_unit_number(unit)}#",
             "batch": row.get("批次") or "",
@@ -239,76 +235,12 @@ def _labels() -> list[dict[str, Any]]:
             "start": start_text,
             "end": end_text,
             "duration": _to_float(row.get("持续自然小时数")),
-            "maxSpread": _to_float(row.get("最大级差变化")),
-            "maxPeer": _to_float(row.get("最大同级偏离")),
-            "maxPeerLow": _to_float(row.get("最大同级偏低")),
+            "maxSpread": None if is_hf else _to_float(row.get("最大级差变化")),
+            "maxPeer": None if is_hf else _to_float(row.get("最大同级偏离")),
+            "maxPeerLow": None if is_hf else _to_float(row.get("最大同级偏低")),
             "relatedChannel": row.get("关联通道异常") or "",
             "evidence": row.get("阶段触发依据") or "",
-            "oldEvent": f"{level}-{feature}",
-            "note": "",
-        })
-
-    for index, row in enumerate(transition_rows):
-        unit = (row.get("机组") or "").strip()
-        start_text = row.get("开始小时") or ""
-        end_text = row.get("结束小时") or ""
-        items.append({
-            "key": row.get("key") or f"transition:{index}",
-            "title": row.get("title") or "",
-            "kind": "temperature_transition",
-            "kindLabel": "过渡段",
-            "device": unit,
-            "deviceCode": f"{_unit_number(unit)}#",
-            "batch": row.get("批次") or "",
-            "cycle": row.get("周期编号") or "",
-            "grade": row.get("级") or "",
-            "stage": row.get("过渡类型") or "",
-            "transition": row.get("过渡类型") or "",
-            "level": row.get("温度阶段") or "",
-            "feature": row.get("特征类型") or "",
-            "direction": row.get("方向") or "",
-            "start": start_text,
-            "end": end_text,
-            "duration": _to_float(row.get("持续自然小时数")),
-            "maxSpread": _to_float(row.get("最大级差变化")),
-            "maxPeer": _to_float(row.get("最大同级偏离")),
-            "maxPeerLow": _to_float(row.get("最大同级偏低")),
-            "relatedChannel": row.get("关联通道异常") or "",
-            "evidence": row.get("阶段触发依据") or "",
-            "oldEvent": row.get("关联旧事件") or "",
-            "note": row.get("过渡说明") or "",
-        })
-
-    for index, row in enumerate(_read_csv(TEMPERATURE_HF_CSV)):
-        unit = (row.get("机组") or "").strip()
-        start_text = row.get("开始小时") or ""
-        end_text = row.get("结束小时") or ""
-        level = row.get("温度阶段") or ""
-        grade = row.get("级") or ""
-        items.append({
-            "key": f"hf:{index}",
-            "title": f"{unit}-{grade}-{level}-高频波动-{start_text[:16]}",
-            "kind": "temperature_hf",
-            "kindLabel": "高频波动",
-            "device": unit,
-            "deviceCode": f"{_unit_number(unit)}#",
-            "batch": row.get("批次") or "",
-            "cycle": row.get("周期编号") or "",
-            "grade": grade,
-            "stage": level,
-            "transition": "",
-            "level": level,
-            "feature": "高频波动",
-            "direction": "波动",
-            "start": start_text,
-            "end": end_text,
-            "duration": _to_float(row.get("持续自然小时数")),
-            "maxSpread": None,
-            "maxPeer": None,
-            "maxPeerLow": None,
-            "relatedChannel": row.get("关联通道异常") or "",
-            "evidence": row.get("阶段触发依据") or "",
-            "oldEvent": "高频波动",
+            "oldEvent": "高频波动" if is_hf else f"{level}-{feature}",
             "note": "",
         })
 
@@ -420,6 +352,8 @@ def _build_chart(label: dict[str, Any]) -> dict[str, Any]:
             "x": {"max": 0, "times": [], "gaps": [], "shutdowns": []},
             "fault": {"start": 0, "end": 0}, "yellowBands": [], "subplots": [], "empty": True,
             "relatedChannel": label.get("relatedChannel") or "",
+            "faultHit": label.get("faultHit") or "否",
+            "faultDescriptions": label.get("faultDescriptions") or "",
             "evidence": label.get("evidence") or "",
             "breakdown": {},
         }
@@ -531,7 +465,7 @@ def _build_chart(label: dict[str, Any]) -> dict[str, Any]:
             {"name": "同级偏高", "color": "#e8890c", "data": _series_points(peer_high)},
             {"name": "同级偏低", "color": "#2e9e5b", "data": _series_points(peer_low)},
         ],
-        [{"value": 4, "label": "轻微"}, {"value": 8, "label": "异常"}, {"value": 15, "label": "严重"}],
+        [{"value": 4, "label": "轻微"}, {"value": 8, "label": "异常"}, {"value": 15, "label": "严重异常"}],
         low, max(high, 16),
     ))
 
@@ -539,67 +473,54 @@ def _build_chart(label: dict[str, Any]) -> dict[str, Any]:
     def column_values(column: str) -> list[float | None]:
         return [_to_float(item.get(column)) if item else None for item in display]
 
+    aux_series: list[tuple[str, list[float | None], str]] = []
     if unit == 4:
         body = []
         for first, second in zip(column_values("YSJ_37"), column_values("YSJ_38")):
             candidates = [value for value in (first, second) if value is not None]
             body.append(max(candidates) if candidates else None)
-        cumulative = column_values("YSJ_31")
-        cumulative_clean = []
-        for index, value in enumerate(cumulative):
-            if index and value is not None and cumulative[index - 1] is not None:
-                delta = value - cumulative[index - 1]
-                cumulative_clean.append(None if (delta < -1 or delta > 2) else value)
-            else:
-                cumulative_clean.append(value)
         inlet = column_values("YSJ_2")
         run_state = []
         for body_value, inlet_value in zip(body, inlet):
             candidates = [value for value in (body_value, inlet_value) if value is not None]
             run_state.append((1.0 if max(candidates) > 0.5 else 0.0) if candidates else None)
-        for title, unit_name, values, color in [
-            ("运行状态", "", run_state, "#8e44ad"),
-            ("累计运行小时", "h", cumulative_clean, "#8e44ad"),
-            ("机身振动", "mm/s", body, "#e8890c"),
-            ("一级进气压力", "MPa", inlet, "#2e9e5b"),
-        ]:
-            present = [value for value in values if value is not None]
-            low, high = _padded(present)
-            subplots.append(_subplot(
-                title, unit_name,
-                [{"name": title, "color": color, "data": _series_points(values)}],
-                [], low, high,
-            ))
+        aux_series = [
+            ("运行状态", run_state, "#8e44ad"),
+            ("机身振动", body, "#e8890c"),
+            ("一级进气压力", inlet, "#2e9e5b"),
+        ]
     elif unit in (5, 6):
         body = []
         for values in zip(*(column_values(column) for column in ("YSJ_10", "YSJ_11", "YSJ_12", "YSJ_13"))):
             candidates = [value for value in values if value is not None]
             body.append(max(candidates) if candidates else None)
-        for title, unit_name, columns, colors in [
-            ("机身振动", "mm/s", [("YSJ_10", "机身1"), ("YSJ_11", "机身2"), ("YSJ_12", "机身3"), ("YSJ_13", "机身4")], COLORS),
-            ("排气压力", "MPa", [("YSJ_5", "一级排气"), ("YSJ_6", "二级排气")], ["#1f6feb", "#e8890c"]),
-            ("调节阀开度", "%", [("YSJ_14", "调节阀")], ["#2e9e5b"]),
+        for title, columns, colors in [
+            ("机身振动", [("YSJ_10", "机身1"), ("YSJ_11", "机身2"), ("YSJ_12", "机身3"), ("YSJ_13", "机身4")], COLORS),
+            ("排气压力", [("YSJ_5", "一级排气"), ("YSJ_6", "二级排气")], ["#1f6feb", "#e8890c"]),
+            ("调节阀开度", [("YSJ_14", "调节阀")], ["#2e9e5b"]),
         ]:
-            series = []
-            present = []
             for index, (column, name) in enumerate(columns):
-                values = column_values(column)
-                present.extend(value for value in values if value is not None)
-                series.append({"name": name, "color": colors[index % len(colors)], "data": _series_points(values)})
-            low, high = _padded(present)
-            subplots.append(_subplot(title, unit_name, series, [], low, high))
+                aux_series.append((name, column_values(column), colors[index % len(colors)]))
     else:
-        for title, unit_name, column, color in [
-            ("转速", "RPM", "YSJ_41", "#8e44ad"),
-        ]:
-            values = column_values(column)
+        aux_series = [("转速", column_values("YSJ_41"), "#8e44ad")]
+
+    if aux_series:
+        def _normalize(values: list[float | None]) -> list[float | None]:
             present = [value for value in values if value is not None]
-            low, high = _padded(present)
-            subplots.append(_subplot(
-                title, unit_name,
-                [{"name": title, "color": color, "data": _series_points(values)}],
-                [], low, high,
-            ))
+            if not present:
+                return values
+            low, high = min(present), max(present)
+            if high - low < 1e-9:
+                return [None if value is None else 0.5 for value in values]
+            return [None if value is None else (value - low) / (high - low) for value in values]
+
+        normalized = [
+            {"name": f"{name}(归一)", "color": color, "data": _series_points(_normalize(values))}
+            for name, values, color in aux_series
+        ]
+        subplots.append(_subplot(
+            "开关机辅助信号(归一化)", "", normalized, [], -0.05, 1.05,
+        ))
 
     fault_start = 0
     fault_end = len(display) - 1
@@ -671,6 +592,8 @@ def _build_chart(label: dict[str, Any]) -> dict[str, Any]:
         "subplots": subplots,
         "empty": False,
         "relatedChannel": label.get("relatedChannel") or "",
+        "faultHit": label.get("faultHit") or "否",
+        "faultDescriptions": label.get("faultDescriptions") or "",
         "evidence": label.get("evidence") or "",
         "breakdown": breakdown,
     }

+ 561 - 0
build_temperature_tag_manual.py

@@ -0,0 +1,561 @@
+#!/usr/bin/env python3
+"""Generate the temperature evolution label handbook.
+
+This follows the layout rules of ``build_tag_manual.py`` (the pressure/vibration
+handbook), but uses the temperature-only page and the canonical
+``_tmp_temperature/out/温度异常段.csv`` output.
+"""
+from __future__ import annotations
+
+import argparse
+import csv
+import hashlib
+import json
+import shutil
+import subprocess
+import tempfile
+import time
+from collections import Counter
+from datetime import date
+from pathlib import Path
+from urllib.parse import quote
+from urllib.request import urlopen
+
+from PIL import Image
+from docx import Document
+from docx.enum.section import WD_ORIENT
+from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
+from docx.oxml import OxmlElement
+from docx.oxml.ns import qn
+from docx.shared import Cm, Pt, RGBColor
+
+from build_tag_manual import (
+    BODY_FONT,
+    BODY_SIZE,
+    HEAD_FONT,
+    add_attr_table,
+    add_table,
+    body_paragraph,
+    set_run_font,
+)
+
+ROOT = Path(__file__).resolve().parent
+OUT_DIR = ROOT / "总结文档"
+FIG_DIR = OUT_DIR / "figures_temperature"
+DEFAULT_DOCX = OUT_DIR / "组态温度数据演化过程故障标签手册.docx"
+CANONICAL_CSV = ROOT / "_tmp_temperature" / "out" / "温度异常段.csv"
+BASE_URL = "http://127.0.0.1:5173/temperature.html"
+API_URL = "http://127.0.0.1:8000/api/temperature-transition/labels"
+CHROME = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
+
+DEVICE_ORDER = {f"{unit}号机": unit for unit in range(4, 10)}
+STAGE_ORDER = {"轻微": 0, "异常": 1, "严重异常": 2}
+KIND_ORDER = {"temperature_event": 0, "temperature_hf": 1}
+
+
+def configure_document(doc: Document) -> None:
+    section = doc.sections[0]
+    section.orientation = WD_ORIENT.LANDSCAPE
+    section.page_width = Cm(29.7)
+    section.page_height = Cm(21.0)
+    section.top_margin = Cm(2.0)
+    section.bottom_margin = Cm(2.0)
+    section.left_margin = Cm(2.0)
+    section.right_margin = Cm(2.0)
+
+    normal = doc.styles["Normal"]
+    normal.font.name = BODY_FONT
+    normal.font.size = Pt(BODY_SIZE)
+    normal.font.color.rgb = RGBColor(0, 0, 0)
+    normal.element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), BODY_FONT)
+    normal.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
+    normal.paragraph_format.space_before = Pt(0)
+    normal.paragraph_format.space_after = Pt(0)
+
+    heading1 = doc.styles["Heading 1"]
+    heading1.font.name = HEAD_FONT
+    heading1.font.size = Pt(16)
+    heading1.font.bold = True
+    heading1.font.color.rgb = RGBColor(0, 0, 0)
+    heading1.element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), HEAD_FONT)
+    heading1.paragraph_format.space_before = Pt(18)
+    heading1.paragraph_format.space_after = Pt(10)
+    heading1.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+    heading1.paragraph_format.keep_with_next = True
+
+    heading2 = doc.styles["Heading 2"]
+    heading2.font.name = HEAD_FONT
+    heading2.font.size = Pt(14)
+    heading2.font.bold = True
+    heading2.font.color.rgb = RGBColor(0, 0, 0)
+    heading2.element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), HEAD_FONT)
+    heading2.paragraph_format.space_before = Pt(12)
+    heading2.paragraph_format.space_after = Pt(6)
+    heading2.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+    heading2.paragraph_format.keep_with_next = True
+
+    add_footer(doc)
+
+
+def add_footer(doc: Document) -> None:
+    section = doc.sections[0]
+    footer = section.footer
+    paragraph = footer.paragraphs[0]
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("组态温度数据演化过程故障标签手册    第 ")
+    set_run_font(run, BODY_FONT, 9)
+    field = OxmlElement("w:fldSimple")
+    field.set(qn("w:instr"), "PAGE")
+    paragraph._p.append(field)
+    tail = paragraph.add_run(" 页")
+    set_run_font(tail, BODY_FONT, 9)
+
+
+def _text(value) -> str:
+    if value is None:
+        return "—"
+    text = str(value).strip()
+    if not text or text.lower() in {"nan", "none", "null"}:
+        return "—"
+    return text
+
+
+def _field(key: str, label: str, value, span: int = 1) -> dict:
+    return {"key": key, "label": label, "value": _text(value), "span": span}
+
+
+def _common_fields(row: dict, item: dict) -> list[dict]:
+    return [
+        _field("机组", "机组", row.get("机组")),
+        _field("周期编号", "周期编号", row.get("周期编号")),
+        _field("级", "级", row.get("级")),
+        _field("温度阶段", "阶段", row.get("温度阶段")),
+        _field("阶段部位", "故障部位", row.get("阶段部位")),
+        _field("阶段点位", "点位", row.get("阶段点位")),
+        _field("方向", "方向", row.get("方向")),
+        _field("特征类型", "特征类型", row.get("特征类型")),
+        _field("置信度", "置信度", row.get("置信度")),
+        _field("开始小时", "开始", row.get("开始小时")),
+        _field("结束小时", "结束", row.get("结束小时")),
+        _field("持续自然小时数", "自然小时", row.get("持续自然小时数")),
+        _field("有效运行小时数", "有效运行小时", row.get("有效运行小时数")),
+        _field("峰值时刻", "峰值时刻", row.get("峰值时刻")),
+        _field("峰值缸", "峰值缸", row.get("峰值缸")),
+        _field("最高温度", "最高温度(℃)", row.get("最高温度")),
+    ]
+
+
+def build_fields(row: dict, item: dict) -> list[dict]:
+    fields = _common_fields(row, item)
+    if item.get("kind") == "temperature_hf":
+        fields.extend([
+            _field("高频波动倍数", "高频波动倍数", row.get("高频波动倍数")),
+            _field("高频波动z", "高频波动z", row.get("高频波动z")),
+            _field("高频标准差", "高频标准差(℃)", row.get("高频标准差")),
+            _field("高频基线标准差", "基线标准差(℃)", row.get("高频基线标准差")),
+            _field("高频波动缸", "高频波动缸", row.get("高频波动缸")),
+            _field("去趋势残差标准差", "去趋势残差标准差(℃)", row.get("去趋势残差标准差")),
+            _field("每小时反复升降次数", "反复升降(次/小时)", row.get("每小时反复升降次数")),
+        ])
+    else:
+        fields.extend([
+            _field("最大级差", "最大级差(℃)", row.get("最大级差")),
+            _field("最大级差基线", "最大级差基线(℃)", row.get("最大级差基线")),
+            _field("最大级差变化", "最大级差变化(℃)", row.get("最大级差变化")),
+            _field("最大同级偏离", "最大同级偏离(℃)", row.get("最大同级偏离")),
+            _field("最大同级偏低", "最大同级偏低(℃)", row.get("最大同级偏低")),
+            _field("最大稳健z", "最大稳健z", row.get("最大稳健z")),
+            _field("最大同级相对1h", "同级相对1h(℃)", row.get("最大同级相对1h")),
+            _field("最大同级相对3h", "同级相对3h(℃)", row.get("最大同级相对3h")),
+            _field("最大同级相对6h", "同级相对6h(℃)", row.get("最大同级相对6h")),
+            _field("首次短时触发", "首次短时触发", row.get("首次短时触发")),
+            _field("首次持续触发", "首次持续触发", row.get("首次持续触发")),
+            _field("阶段高报警小时数", "高报小时", row.get("阶段高报警小时数")),
+            _field("阶段高高报警小时数", "高高报小时", row.get("阶段高高报警小时数")),
+        ])
+    fields.append(_field("是否形成确认等级", "确认等级", row.get("是否形成确认等级")))
+    fields.append(_field("维修命中", "维修命中", item.get("faultHit") or "否"))
+    fields.append(_field("维修备注", "维修备注", item.get("faultDescriptions"), span=2))
+    fields.append(_field("阶段触发依据", "触发依据", row.get("阶段触发依据"), span=2))
+    return fields
+
+
+def load_labels() -> list[dict]:
+    with urlopen(API_URL, timeout=20) as response:
+        payload = json.load(response)
+    with CANONICAL_CSV.open(encoding="utf-8-sig", newline="") as handle:
+        rows = list(csv.DictReader(handle))
+    by_key = {f"event:{index}": row for index, row in enumerate(rows)}
+
+    labels = []
+    for item in payload.get("items") or []:
+        row = by_key.get(item.get("key") or "")
+        if row is None:
+            continue
+        label = dict(item)
+        label["device"] = row.get("机组") or item.get("device") or ""
+        label["grade"] = row.get("级") or item.get("grade") or ""
+        label["stage"] = row.get("温度阶段") or item.get("stage") or ""
+        label["start"] = row.get("开始小时") or item.get("start") or ""
+        label["end"] = row.get("结束小时") or item.get("end") or ""
+        label["fields"] = build_fields(row, item)
+        labels.append(label)
+    return labels
+
+
+def fetch_ready() -> None:
+    for name, url in (
+        ("温度后端服务", API_URL),
+        ("温度前端页面", BASE_URL),
+    ):
+        try:
+            with urlopen(url, timeout=5):
+                pass
+        except Exception as error:
+            raise SystemExit(
+                f"{name}未启动或不可访问:{error}\n"
+                "请先启动:uvicorn app.main:app --app-dir backend --port 8000\n"
+                "并启动:cd frontend && npm run dev"
+            ) from error
+
+
+def screenshot(label: dict, profile_dir: Path, force: bool = False) -> Path:
+    FIG_DIR.mkdir(parents=True, exist_ok=True)
+    digest = hashlib.sha1(str(label.get("title") or label.get("key") or "").encode("utf-8")).hexdigest()[:10]
+    stem = f"{label['key'].replace(':', '_')}_{digest}"
+    jpg_path = FIG_DIR / f"{stem}.jpg"
+    if jpg_path.exists() and not force:
+        return jpg_path
+    png_path = FIG_DIR / f"{stem}.png"
+    url = f"{BASE_URL}?key={quote(label['key'])}&chart=1&doc=1"
+    command = [
+        CHROME,
+        "--headless=new",
+        "--disable-gpu",
+        "--hide-scrollbars",
+        "--window-size=1800,900",
+        "--force-device-scale-factor=2",
+        "--virtual-time-budget=20000",
+        "--run-all-compositor-stages-before-draw",
+        f"--user-data-dir={profile_dir}",
+        f"--screenshot={png_path}",
+        url,
+    ]
+    for attempt in range(2):
+        subprocess.run(
+            command,
+            check=True,
+            stdout=subprocess.DEVNULL,
+            stderr=subprocess.DEVNULL,
+            timeout=120,
+        )
+        if png_path.exists() and png_path.stat().st_size > 5000:
+            break
+        time.sleep(1)
+    if not png_path.exists() or png_path.stat().st_size <= 5000:
+        raise RuntimeError(f"截图失败:{label['key']}")
+    image = Image.open(png_path).convert("RGB")
+    image = image.resize((2200, 1100), Image.LANCZOS)
+    image.save(jpg_path, quality=90, optimize=True)
+    png_path.unlink(missing_ok=True)
+    return jpg_path
+
+
+def sort_key(label: dict) -> tuple:
+    return (
+        DEVICE_ORDER.get(label.get("device") or "", 99),
+        KIND_ORDER.get(label.get("kind") or "", 9),
+        label.get("start") or "",
+    )
+
+
+def add_cover(doc: Document, labels: list[dict]) -> None:
+    for _ in range(4):
+        doc.add_paragraph()
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("组态温度数据演化过程")
+    set_run_font(run, HEAD_FONT, 26, True)
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("故障标签手册")
+    set_run_font(run, HEAD_FONT, 26, True)
+
+    doc.add_paragraph()
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run("温度事件 · 高频波动")
+    set_run_font(run, BODY_FONT, 16, False)
+
+    for _ in range(6):
+        doc.add_paragraph()
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run(f"共 {len(labels)} 条演化标签")
+    set_run_font(run, BODY_FONT, 12, False)
+    paragraph = doc.add_paragraph()
+    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+    run = paragraph.add_run(f"{date.today().year} 年 {date.today().month} 月")
+    set_run_font(run, BODY_FONT, 12, False)
+    doc.add_page_break()
+
+
+def add_reading_guide(doc: Document, labels: list[dict]) -> None:
+    doc.add_heading("文档阅读说明", level=1)
+    body_paragraph(
+        doc,
+        "用途:本手册汇总设备运行过程中由规则扫描形成的缸体温度演化标签,"
+        "逐条给出标签属性、演化阶段和标签前后运行曲线,用于复核、诊断和维修决策辅助。",
+        "用途:",
+    )
+    body_paragraph(
+        doc,
+        "阅读方法:先阅读标签数量总结,了解总体分布和演化过程;再按章节、机组或阶段查阅详情。"
+        "在 Word 中打开导航窗格,可通过一级、二级标题直接跳转到对应章节或标签。",
+        "阅读方法:",
+    )
+    body_paragraph(
+        doc,
+        "排序方式:详情部分分为温度事件、高频波动两章,章内按机组和开始时间排序;"
+        "同一标签的所有属性集中在一张表中,图表位于属性表下方。",
+        "排序方式:",
+    )
+    body_paragraph(
+        doc,
+        "数据口径:标签来自温度演化阶段统计记录;曲线来自设备运行监测数据,只使用运行样本,"
+        "停机、坏点和无效值不参与曲线绘制。标签是规则扫描结果,不等同于物理故障结论。",
+        "数据口径:",
+    )
+
+    doc.add_heading("标签体系", level=2)
+    rows = [
+        ["温度事件", "同级温差、短时变化和 6h 单缸相对抬升形成的阶段段;包含持续偏高、持续偏低、混合、单缸抬升等类型。"],
+        ["高频波动", "三级单缸先去慢趋势,再按残差标准差和反复升降次数确认的高频波动段,单独成章;不参与同级温差事件判定。"],
+    ]
+    add_table(doc, ["类型", "含义"], rows, [5.0, 20.5], font_size=9.5)
+
+    doc.add_heading("等级与单位", level=2)
+    rows = [
+        ["轻微", "达到轻微门槛,持续时间较短或尚未形成连续确认。"],
+        ["异常", "偏离扩大并形成连续阶段,应结合曲线复核。"],
+        ["严重异常", "达到严重门槛,应优先复核。"],
+        ["温度", "℃"],
+        ["自然/有效小时", "小时(个有效运行小时)"],
+        ["级差/同级偏离", "℃"],
+        ["高频波动倍数", "倍;高频波动 z 为稳健 z 分数。"],
+    ]
+    add_table(doc, ["项目", "含义 / 单位"], rows, [5.0, 20.5], font_size=9.5)
+
+    doc.add_heading("基线说明", level=2)
+    body_paragraph(
+        doc,
+        "本手册沿用当前温度算法的基线口径,没有新增或重算“温度基线”。"
+        "属性表中的“最大级差基线”是现有算法输出的级差基线;"
+        "温度事件主要结合同级偏高/偏低、级差变化、短时相对变化和持续小时数阅读。"
+        "因此本手册的基线与压力“周期固定基线”、振动“近期滚动基线”不是同一口径,"
+        "不能直接横向比较。",
+        "基线说明:",
+    )
+    body_paragraph(
+        doc,
+        "温度事件判断的是同一级内某缸相对同级中位的变化,以及该变化相对自身平时偏移的增量;"
+        "高频波动判断的是三级单缸小时标准差相对近期正常标准差的倍数。"
+        "两者都不是绝对温度报警,需结合阶段触发依据和现场记录确认。",
+        "判定口径:",
+    )
+
+    doc.add_heading("图形解释", level=2)
+    rows = [
+        ["红色背景", "当前标签对应的故障阶段。"],
+        ["淡黄色背景", "总表中其他标签与当前展示窗口重合的时间段。"],
+        ["竖向虚线", "停机边界;左侧为关机,右侧为开机。"],
+        ["标题下备注", "标签时间、图表展示时间,以及各停机段的关机/开机时间。"],
+        ["同级温差子图", "级差、同级偏高、同级偏低;用于判断单缸相对偏差。"],
+        ["缸温子图", "各级各缸排气温度原值。"],
+        ["开关机辅助子图", "运行状态、机身振动、进气压/排气压力、调节阀、转速等归一化后合并为一张子图,多条线。"],
+        ["右上角角标", "标签阶段:轻微、异常或严重异常。"],
+        ["底部滑块", "时间轴缩放控件。"],
+    ]
+    add_table(doc, ["图形元素", "含义"], rows, [5.0, 20.5], font_size=9.5)
+    body_paragraph(
+        doc,
+        "展示范围:标签前后各补充 6 小时运行数据;停机段压缩为空档并用竖向虚线标出。"
+        "每条标签均附属性表和单张曲线图;图表已压缩子图高度,保证多个子图在同一张图中完整显示。",
+        "展示范围:",
+    )
+
+
+def add_summary(doc: Document, labels: list[dict]) -> None:
+    doc.add_heading("一、标签数量总结", level=1)
+    body_paragraph(
+        doc,
+        f"本手册共收录 {len(labels)} 条演化标签,覆盖温度事件和高频波动两类,"
+        "按机组和阶段统计如下。",
+    )
+
+    kind_counts = Counter(label["kindLabel"] for label in labels)
+    device_kind = Counter((label["device"], label["kindLabel"]) for label in labels)
+    device_stage = Counter((label["device"], label["stage"]) for label in labels)
+    feature_counts = Counter(label.get("feature") or label["kindLabel"] for label in labels)
+    total_stage = Counter(label["stage"] for label in labels)
+    devices = [f"{unit}号机" for unit in range(4, 10)]
+
+    doc.add_heading("1.1 按机组统计", level=2)
+    rows = []
+    for device in devices:
+        event = device_kind.get((device, "温度事件"), 0)
+        hf = device_kind.get((device, "高频波动"), 0)
+        rows.append([device, str(event), str(hf), str(event + hf)])
+    rows.append([
+        "合计",
+        str(kind_counts.get("温度事件", 0)),
+        str(kind_counts.get("高频波动", 0)),
+        str(len(labels)),
+    ])
+    add_table(doc, ["机组", "温度事件", "高频波动", "合计"], rows, [6.0, 6.0, 6.0, 6.0], align_center=True)
+
+    doc.add_heading("1.2 按机组和阶段统计", level=2)
+    rows = []
+    for device in devices:
+        values = [device_stage.get((device, stage), 0) for stage in ("轻微", "异常", "严重异常")]
+        rows.append([device, *[str(value) for value in values], str(sum(values))])
+    rows.append([
+        "合计",
+        *[str(total_stage.get(stage, 0)) for stage in ("轻微", "异常", "严重异常")],
+        str(len(labels)),
+    ])
+    add_table(
+        doc,
+        ["机组", "轻微", "异常", "严重异常", "合计"],
+        rows,
+        [6.0, 4.5, 4.5, 5.0, 5.0],
+        align_center=True,
+    )
+
+    doc.add_heading("1.3 按特征类型统计", level=2)
+    rows = [[name, str(count)] for name, count in sorted(feature_counts.items(), key=lambda item: (-item[1], item[0]))]
+    add_table(doc, ["特征类型", "数量"], rows, [12.0, 8.0], align_center=True)
+
+    doc.add_heading("1.4 总体演化过程", level=2)
+    events = kind_counts.get("温度事件", 0)
+    hf = kind_counts.get("高频波动", 0)
+    slight = total_stage.get("轻微", 0)
+    abnormal = total_stage.get("异常", 0)
+    severe = total_stage.get("严重异常", 0)
+    min_start = min(label["start"] for label in labels)
+    max_end = max(label["end"] for label in labels)
+    body_paragraph(
+        doc,
+        f"标签时间覆盖 {min_start[:10]} 至 {max_end[:10]}。温度事件 {events} 条,"
+        f"占 {events / len(labels) * 100:.1f}%;高频波动 {hf} 条,占 "
+        f"{hf / len(labels) * 100:.1f}%。",
+    )
+    body_paragraph(
+        doc,
+        f"按阶段看,轻微 {slight} 条、异常 {abnormal} 条、严重异常 {severe} 条。"
+        "温度事件中多数为轻微阶段,异常和严重异常主要出现在持续偏离或单缸相对抬升过程中;"
+        "高频波动全部来自三级单缸,需结合去趋势残差和反复升降次数复核。",
+    )
+    body_paragraph(
+        doc,
+        "阅读详情时,应结合同级温差、级差变化、短时相对变化、持续有效小时数、高频波动倍数和阶段触发依据,"
+        "判断标签是单次波动还是持续演化,并结合现场维修记录进行确认。",
+    )
+
+
+def add_detail_chapters(
+    doc: Document,
+    labels: list[dict],
+    profile_dir: Path,
+    force: bool,
+    limit: int,
+    single_image: str,
+) -> None:
+    chapters = (
+        ("temperature_event", "二、温度事件标签详情", "温度事件"),
+        ("temperature_hf", "三、高频波动标签详情", "高频波动"),
+    )
+    for kind, title, kind_label in chapters:
+        items = sorted([label for label in labels if label.get("kind") == kind], key=sort_key)
+        if limit:
+            items = items[:limit]
+        doc.add_page_break()
+        doc.add_heading(title, level=1)
+        stage_counts = Counter(item.get("stage") for item in items)
+        body_paragraph(
+            doc,
+            f"本章共 {len(items)} 条{kind_label}标签,其中轻微 {stage_counts.get('轻微', 0)} 条、"
+            f"异常 {stage_counts.get('异常', 0)} 条、严重异常 {stage_counts.get('严重异常', 0)} 条。"
+            "章内按机组和开始时间排列;每个二级标题对应一条标签,标题下方为属性表,"
+            "属性表下方为单张压缩子图高度的曲线图。",
+        )
+        for index, label in enumerate(items, start=1):
+            print(f"[{kind} {index}/{len(items)}] {label.get('title')}")
+            if index > 1:
+                doc.add_page_break()
+            heading = (
+                f"{label.get('device')}-{label.get('grade')}-{label.get('stage')}-"
+                f"{label.get('feature')}-{label.get('start', '')[:16]}"
+            )
+            doc.add_heading(heading, level=2)
+            add_attr_table(doc, label.get("fields") or [])
+            if not single_image or label["key"] == single_image:
+                image_path = screenshot(label, profile_dir, force=force)
+                picture_paragraph = doc.add_paragraph()
+                picture_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
+                picture_paragraph.paragraph_format.space_before = Pt(4)
+                picture_paragraph.paragraph_format.space_after = Pt(2)
+                picture_paragraph.paragraph_format.keep_with_next = True
+                run = picture_paragraph.add_run()
+                run.add_picture(str(image_path), width=Cm(24.0))
+                caption = doc.add_paragraph()
+                caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
+                caption.paragraph_format.line_spacing_rule = WD_LINE_SPACING.SINGLE
+                caption.paragraph_format.space_after = Pt(6)
+                run = caption.add_run("图:标签前后运行曲线(红色为故障段,竖向虚线为关机/开机边界)")
+                set_run_font(run, BODY_FONT, 9.0)
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--limit", type=int, default=0, help="每章只生成前 N 条,用于冒烟测试")
+    parser.add_argument("--output", type=Path, default=DEFAULT_DOCX)
+    parser.add_argument("--force", action="store_true", help="强制重新截图")
+    parser.add_argument(
+        "--single-image",
+        default="",
+        help="只插入该标签的曲线图;传空字符串表示全部插入",
+    )
+    args = parser.parse_args()
+
+    fetch_ready()
+    labels = load_labels()
+    print(f"标签总数:{len(labels)}")
+    kinds = Counter(label["kindLabel"] for label in labels)
+    print(f"类型统计:{dict(kinds)}")
+
+    args.output.parent.mkdir(parents=True, exist_ok=True)
+    profile_dir = Path(tempfile.mkdtemp(prefix="temperature_manual_chrome_"))
+    try:
+        doc = Document()
+        configure_document(doc)
+        add_cover(doc, labels)
+        add_reading_guide(doc, labels)
+        add_summary(doc, labels)
+        add_detail_chapters(
+            doc,
+            labels,
+            profile_dir,
+            args.force,
+            args.limit,
+            args.single_image,
+        )
+        doc.save(args.output)
+        print(f"已生成:{args.output}")
+        print(f"截图目录:{FIG_DIR}")
+    finally:
+        shutil.rmtree(profile_dir, ignore_errors=True)
+
+
+if __name__ == "__main__":
+    main()

+ 6 - 7
frontend/src/temperature/TemperatureApp.vue

@@ -83,11 +83,11 @@ async function copyTitle(item: ReviewItem): Promise<void> {
 const devices = computed(() => Array.from(new Set(labels.value.map((item) => item.device))))
 const grades = computed(() => Array.from(new Set(labels.value.map((item) => item.grade))))
 const stages = computed(() =>
-  Array.from(new Set(labels.value.map((item) => item.transition || item.level).filter(Boolean))),
+  Array.from(new Set(labels.value.map((item) => item.level).filter(Boolean))),
 )
 
 function stageValue(item: ReviewItem): string {
-  return item.transition || item.level
+  return item.level
 }
 
 const filtered = computed(() =>
@@ -142,8 +142,8 @@ onMounted(loadLabels)
   <div v-else class="tag-page">
     <aside class="sidebar">
       <header class="sidebar-head">
-        <h1>温度事件 / 过渡段 / 高频波动观察</h1>
-        <p>观察温度事件与启停过渡段的全部检测指标(双击标题可复制)</p>
+        <h1>温度事件 / 高频波动观察</h1>
+        <p>观察温度事件与三级高频波动的全部检测指标(双击标题可复制)</p>
       </header>
 
       <div v-if="summary" class="summary">
@@ -158,7 +158,6 @@ onMounted(loadLabels)
           <select v-model="kindFilter">
             <option value="all">全部</option>
             <option value="temperature_event">温度事件</option>
-            <option value="temperature_transition">过渡段</option>
             <option value="temperature_hf">高频波动</option>
           </select>
         </label>
@@ -170,7 +169,7 @@ onMounted(loadLabels)
           </select>
         </label>
         <label>
-          <span>阶段 / 过渡</span>
+          <span>阶段</span>
           <select v-model="stage">
             <option value="all">全部</option>
             <option v-for="item in stages" :key="item" :value="item">{{ item }}</option>
@@ -184,7 +183,7 @@ onMounted(loadLabels)
           </select>
         </label>
         <label>
-          <span>命中维修事件</span>
+          <span>维修命中</span>
           <select v-model="faultHit">
             <option value="all">全部</option>
             <option value="是">是</option>

+ 22 - 11
frontend/src/temperature/TemperatureChart.vue

@@ -60,16 +60,26 @@ interface ChartData {
   subplots: Subplot[]
   empty: boolean
   relatedChannel: string
+  faultHit: string
+  faultDescriptions: string
   evidence: string
   breakdown: Breakdown | null
 }
 
 const props = defineProps<{ seriesKey: string }>()
 
+const compactChart = new URLSearchParams(window.location.search).get('doc') === '1'
 const el = ref<HTMLElement | null>(null)
 const loading = ref(false)
 const error = ref('')
-const meta = ref<{ relatedChannel: string; evidence: string; breakdown: Breakdown | null; kind: string } | null>(null)
+const meta = ref<{
+  relatedChannel: string
+  faultHit: string
+  faultDescriptions: string
+  evidence: string
+  breakdown: Breakdown | null
+  kind: string
+} | null>(null)
 
 let chart: echarts.ECharts | null = null
 let observer: ResizeObserver | null = null
@@ -104,14 +114,14 @@ function formatNumber(value: number, unit: string): string {
 }
 
 function buildOption(data: ChartData): Record<string, unknown> {
-  const height = el.value?.clientHeight ?? 900
+  const height = compactChart ? 900 : (el.value?.clientHeight ?? 900)
   const count = data.subplots.length
-  const top = 92
-  const bottom = 80
-  const gap = 28
+  const top = compactChart ? 76 : 92
+  const bottom = compactChart ? 52 : 80
+  const gap = compactChart ? 12 : 28
   const rowHeight = count
-    ? Math.max(90, (height - top - bottom - gap * (count - 1)) / count)
-    : 200
+    ? Math.max(compactChart ? 56 : 90, (height - top - bottom - gap * (count - 1)) / count)
+    : (compactChart ? 120 : 200)
   const gridTop = (index: number): number => top + index * (rowHeight + gap)
   const last = count - 1
   const flatUnits: string[] = []
@@ -145,7 +155,6 @@ function buildOption(data: ChartData): Record<string, unknown> {
     '观察': { color: '#5b6472', background: '#eef1f5' },
     '轻微': { color: '#b26a00', background: '#fff1e0' },
     '异常': { color: '#c62828', background: '#ffe8e8' },
-    '严重': { color: '#8e0000', background: '#ffd6d6' },
     '严重异常': { color: '#8e0000', background: '#ffd6d6' },
   }
   const style = stageStyle[data.stage] ?? { color: '#5b6472', background: '#eef1f5' }
@@ -414,13 +423,15 @@ async function load(): Promise<void> {
     current = (await response.json()) as ChartData
     meta.value = {
       relatedChannel: current.relatedChannel,
+      faultHit: current.faultHit,
+      faultDescriptions: current.faultDescriptions,
       evidence: current.evidence,
       breakdown: current.breakdown ?? null,
       kind: current.kind,
     }
     document.title = current.title
     if (el.value) {
-      const height = Math.max(760, 130 + current.subplots.length * 160)
+      const height = compactChart ? 900 : Math.max(760, 130 + current.subplots.length * 160)
       el.value.style.height = `${height}px`
     }
     chart?.resize()
@@ -455,7 +466,7 @@ watch(() => props.seriesKey, load)
 </script>
 
 <template>
-  <div v-if="meta" class="chart-meta">
+  <div v-if="meta && !compactChart" class="chart-meta">
     <div class="meta-def">
       级差 = 同级最高 − 最低;同级偏高/偏低 = 某缸相对同级中位、再扣除自身平时偏移;级差较平时 = 当前级差 − 近期正常级差;高频波动倍数 = 小时标准差 / 近期正常标准差。
     </div>
@@ -471,7 +482,7 @@ watch(() => props.seriesKey, load)
         峰值 {{ meta.breakdown.time.slice(5, 16) }} {{ meta.breakdown.stage }}:{{ meta.breakdown.cylinders[0].name }}={{ fmt(meta.breakdown.cylinders[0].value) }};单缸级,{{ meta.kind === 'temperature_hf' ? '按高频波动倍数判定' : '无同级对照(算法用跨级残差)' }}
       </template>
     </div>
-    <div><span class="meta-label">关联通道异常</span><span>{{ meta.relatedChannel || '无' }}</span></div>
+    <div v-if="meta.faultHit === '是'"><span class="meta-label">维修命中</span><span>{{ meta.faultDescriptions }}</span></div>
     <div><span class="meta-label">阶段触发依据</span><span>{{ meta.evidence || '—' }}</span></div>
   </div>
   <div ref="el" class="tag-chart" />

+ 1 - 1
frontend/temperature.html

@@ -5,7 +5,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta name="theme-color" content="#f5f7fa" />
     <link rel="icon" href="data:," />
-    <title>温度事件 / 过渡段 / 高频波动观察</title>
+    <title>温度事件 / 高频波动观察</title>
   </head>
   <body>
     <div id="app"></div>

BIN
总结文档/组态温度数据演化过程故障标签手册.docx