读取储罐液位CSV历史数据,自动识别溢流,抽空异常时段,统计每月异常时长,输出报表。

📅 2026/7/30 10:28:26
读取储罐液位CSV历史数据,自动识别溢流,抽空异常时段,统计每月异常时长,输出报表。
储罐液位异常自动识别与报表系统 —— 基于Python的工业数据后分析实践液位监测事故的本质从来不是无法测量而是只测不控。—— 哈尔滨工程大学《工业过程控制》课程核心思想一、实际应用场景描述在石油化工、精细化工、水处理、能源电力等行业储罐是生产流程中的关键缓冲节点。以一座典型的中间产品储罐为例- 正常工况液位在 25%~75% 之间随进出料节奏缓慢波动- 进料侧上游装置来料经调节阀进入储罐液位上升- 出料侧下游泵将物料送出液位下降- 安全防线液位计实时测量 → DCS/PLC 显示与报警 → SIS 联锁切断哈尔滨工程大学《工业过程控制》课程彭秀艳等编著高等教育出版社在第三章过程参数检测仪表及变送器中系统讲解了物位检测及变送的各类方法——差压式、雷达式、超声波式、电容式、浮筒式等并在第六章单回路控制系统设计中阐述了液位控制系统的设计方法。然而现场常见的痛点是控制系统只管实时不管回顾。二、引入痛点2.1 现场的真实困境场景 发生了什么 根因月度安全例会 安全员问上个月有几次溢流每次多久 操作员只能凭记忆回答无精确数据工艺优化评审 工程师想分析为什么3月份溢流次数激增 历史趋势数据散落在DCS数据库中导出困难事故调查 监管部门要求提供近半年液位异常时段清单 手动翻阅操作记录耗时数天且不完整设备维护 泵频繁维修怀疑与抽空有关 缺乏泵入口液位低于LL的累计时长统计2.2 核心矛盾DCS/SIS 擅长实时响应但不擅长历史回溯与统计。控制系统的设计目标是液位到达高高HH时在秒级内切断进料阀。这个目标它完成得很好。但管理层需要的是上个月溢流了几次每次持续多久哪些天风险最高——这类事后统计问题标准DCS没有现成答案。2.3 本工具要解决的问题用一段 Python 脚本把液位历史 CSV 数据变成一份结构化的异常统计报表。 让工程师花 5 分钟运行程序就能得到过去半年完整的溢流/抽空事件清单和月度汇总。三、核心逻辑讲解3.1 工业控制理论依据本工具的异常判定逻辑直接来源于工业过程控制中的分级报警与联锁理论100% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ 罐顶┃ ┃90% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ ← 高高(HH)联锁切断进料┃ ┃75% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ ← 高报(H)预警人工干预┃╔════════════════════════════════════════╗ ┃┃║ ║ ┃┃║ ★ 正常操作区间 (安全) ║ ┃┃║ ║ ┃┃╚════════════════════════════════════════╝ ┃┃ ┃25% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ ← 低报(L)预警┃ ┃12% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ ← 低低(LL)联锁停泵0% ┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃ 罐底这套分级机制在 GB 17681-2024《危险化学品重大危险源安全监控技术规范》中有明确规定- 高高液位HH 不应大于液相体积达到计算容积 90% 时的高度- 低低液位LL 应保证泵不发生汽蚀- HH 应联锁关闭进料阀LL 应联锁切断出料3.2 软件实现思路CSV历史数据 ──→ 数据加载/清洗 ──→ 逐点阈值标记 ──→ 连续事件合并 ──→ 月度聚合统计 ──→ 多格式报表│ │ │ ││ │ │ └─ Excel / CSV / 图表│ │ ││ │ └─ cumsum分组 → 事件起止/持续时长│ ││ └─ level ≥ HH ? → 溢流│ └─ level ≤ LL ? → 抽空│└─ 缺失值标记 / 跳变率检测 / 物理范围校验3.3 核心算法连续时段合并逐点标记每行数据标 True/False不能直接给人看——25万行 True/False 毫无意义。需要把连续的异常点合并成事件# 核心一行用 cumsum 技巧为连续 True 段分配唯一IDgroup_id (~flags).cumsum()[flags]原理图解时间点: t1 t2 t3 t4 t5 t6 t7 t8 t9 t10标志位: F T T T F F T T F T~flags: T F F F T T F F T Fcumsum: 1 1 1 1 2 3 3 3 4 4分组ID: - 1 1 1 - - 3 3 - 4↑ ↑事件#1(3个点) 事件#3(1个点)分组后每个事件就有了开始时间、结束时间、持续点数再乘以采样间隔就是持续时长。四、代码模块化讲解项目采用标准的分层架构每个模块职责单一、可独立测试4.1 模块总览模块 职责 关键函数config.yaml 全部参数集中管理 —config_loader.py 解析YAML → 配置对象load_config()generate_sample_data.py 生成模拟数据无真实数据时使用generate_tank_level_csv()data_loader.py CSV读取、质量评估、传感器异常检测load_csv()assess_data_quality()detect_sensor_anomalies()anomaly_detector.py 核心业务逻辑阈值判定 事件提取 月度统计mark_overflow()mark_underflow()extract_anomaly_events()monthly_anomaly_summary()report_generator.py 输出Excel/CSV/图表generate_excel_report()generate_csv_summary()generate_charts()main.py 流程编排串联以上所有模块main()4.2 关键代码片段讲解1配置加载 —— 工程参数一目了然# config.yaml 中的关键参数tank:name: T-101 汽油储罐total_height_mm: 12000 # 罐高12米high_high_pct: 88.0 # HH 88% × 12m 10560mmhigh_pct: 75.0 # H 75% × 12m 9000mmlow_pct: 25.0 # L 25% × 12m 3000mmlow_low_pct: 12.0 # LL 12% × 12m 1440mm阈值用百分比配置程序自动换算为毫米。改罐、改阈值只需编辑 YAML不用碰代码。2传感器级异常检测 —— 先于工艺异常def detect_sensor_anomalies(df, min_phys0, max_phys12000, max_jump_rate500, sampling_sec60):检测三类传感器级问题flag1 → 超物理范围如液位显示15000mm罐才12000mm高flag2 → 变化速率异常如1分钟内液位跳变800mm远超物理可能flag3 → 数据缺失通信中断这一步不是工艺异常而是仪表可信度检查。参考《工业过程控制》第三章对各类液位计误差特性的分析——差压式受温度影响、超声波受泡沫干扰、雷达在高温高压下可能漂移。3事件提取 —— cumsum 的妙用def extract_anomaly_events(df, flag_column, min_duration_sec60, sampling_sec60):flags df[flag_column].fillna(False).astype(bool)if not flags.any():return pd.DataFrame() # 无异常返回空表# ★ 核心算法连续True段分组group_id (~flags).cumsum()[flags]events []for eid, group in df[flags].groupby(group_id):duration_sec len(group) * sampling_secif duration_sec min_duration_sec:continue # 过滤瞬时波动如1个采样点的毛刺events.append({start_time: group.index.min(),end_time: group.index.max(),duration_min: round(duration_sec / 60, 1),peak_level_mm: group[level_mm].max(),mean_level_mm: round(group[level_mm].mean(), 1),})return pd.DataFrame(events)4月度聚合 —— 一行 groupby 搞定def monthly_anomaly_summary(overflow_events, underflow_events, ...):# 按月份分组统计for month in all_months:ov overflow_events[overflow_events[start_time].dt.to_period(M) month]uf underflow_events[underflow_events[start_time].dt.to_period(M) month]rec {month: str(month),overflow_events: len(ov),overflow_duration_min: round(ov[duration_sec].sum() / 60, 1),underflow_events: len(uf),underflow_duration_min: round(uf[duration_sec].sum() / 60, 1),...}4.3 实际运行输出程序运行后控制台输出如下基于模拟数据┌─────────────────────────────────────────────────────────────────┐│ 月度异常时长统计表 │├─────────────────────────────────────────────────────────────────┤│ 2025-01 │ 溢流: 2次/ 115.0min │ 抽空: 0次/ 0.0min ││ 2025-03 │ 溢流: 3次/ 221.0min │ 抽空: 0次/ 0.0min ││ 2025-05 │ 溢流: 1次/ 90.0min │ 抽空: 0次/ 0.0min │└─────────────────────────────────────────────────────────────────┘⚠ 溢流事件详情 (6 次):#1: 2025-01-16 02:04 → 2025-01-16 02:55 (52.0 min, 峰值 11794 mm)#2: 2025-01-16 02:57 → 2025-01-16 03:59 (63.0 min, 峰值 12000 mm)...五、README 文件与使用说明5.1 快速上手3步# 第1步安装依赖pip install -r requirements.txt# 第2步生成模拟数据或用你自己的CSV替换 data/ 目录下的文件python generate_sample_data.py# 第3步一键运行python main.py5.2 使用你自己的数据将你的液位历史数据整理为 CSV 格式timestamp,level_mm2025-01-01 00:00:00,6523.42025-01-01 00:01:00,6528.12025-01-01 00:02:00,6519.7放入data/tank_level_history.csv然后编辑config.yaml 中的tank 参数匹配你的储罐规格再次运行python main.py 即可。5.3 输出文件说明文件 内容output/anomaly_report_*.xlsx Excel报表Sheet1:月度汇总, Sheet2:溢流明细, Sheet3:抽空明细output/monthly_anomaly_summary_*.csv 月度汇总CSV方便程序读取output/charts/01_level_trend_with_anomalies.png 液位趋势图含阈值线和异常高亮output/charts/02_monthly_anomaly_bar.png 月度异常柱状图output/charts/03_anomaly_timeline.png 异常事件时间线output/run.log 运行日志5.4 命令行参数python main.py --config my_config.yaml # 使用自定义配置python main.py --gen-data # 强制重新生成模拟数据python main.py --no-charts # 跳过图表加快速度python main.py --verbose # 详细调试日志六、核心知识点卡片 卡片1工业液位分级报警体系级别 名称 典型设定 动作 设计依据H 高液位预警 70%~80% 声光报警 人工处置 操作员10min内响应HH 高高液位联锁 85%~90% 自动切断进料阀 GB 17681-2024 §6.3.3L 低液位预警 20%~30% 声光报警 检查出料 防泵汽蚀预警LL 低低液位联锁 10%~15% 自动停泵 关出口阀 SH/T 3007 防泵空转 参考《工业过程控制》§3.5 物位检测及变送GB 17681-2024《危险化学品重大危险源安全监控技术规范》 卡片2cumsum 连续分段技巧# 问题如何把 [F,T,T,F,T,F,T,T,T] 分成 [[T,T],[T],[T,T,T]] ?# 答案一行代码group_id (~flags).cumsum()[flags]# 原理每次flags从True变False~flags出现Truecumsum1 → 新组ID# 验证 flags pd.Series([F,T,T,F,T,F,T,T,T]) (~flags).cumsum()[flags]2 1 ← 第1组3 15 2 ← 第2组7 3 ← 第3组8 39 3 这是 pandas 中处理连续区间问题的标准 idiom比循环快100倍。 卡片3数据质量三要素要素 检查方法 容忍阈值 超标处理缺失率df.isna().sum() / len(df) 5% 标记该月数据不可靠跳变率df.diff().abs().max() 500 mm/s 标记传感器故障物理范围 (df 0) (df tank_height) 0 次 参考《工业过程控制》§3.1 测量误差与仪表基本技术指标 卡片4报表设计原则原则 说明 本工具实践可追溯 每条数据可回溯到原始时间戳 Excel明细含起止时间精确到秒可汇总 支持按时间维度聚合 月度/事件级双层统计可视化 一图胜千言 趋势图柱状图时间线三件套可机读 同时输出CSV供其他程序消费monthly_anomaly_summary_*.csv自描述 报表自带标题、时间、参数说明 Excel含标题行生成时间戳七、总结7.1 本工具做了什么1. 数据加载读取任意格式的液位CSV自动识别时间列和液位列2. 质量评估缺失率、跳变率、物理合理性三重检查3. 异常检测基于工业标准的 HH/LL 阈值法识别溢流和抽空4. 事件合并用 cumsum 技巧将离散数据点聚合成异常事件5. 月度统计自动按月份聚合输出异常次数和持续时长6. 多格式报表Excel带格式 CSV机读 图表可视化7.2 技术要点回顾- 理论根基哈尔滨工程大学《工业过程控制》的分级报警与联锁控制理论- 规范依据GB 17681-2024、GB 50160-2008、SH/T 3007 等国家标准- 核心算法cumsum 连续分段 → O(n) 复杂度25万行数据秒级完成- 工程实践配置外置、模块解耦、日志完整、中文图表7.3 适用与不适用场景✅ 适用 ❌ 不适用有明确工艺阈值的液位监测 无阈值的开放水域水位等间隔采样的DCS历史数据 事件驱动的非等间隔记录单储罐月度/季度报表 实时在线监控需OPC UA直连事故调查的数据回溯 多变量耦合的复杂工况诊断7.4 下一步可以做什么- 接实时数据用pymodbus 或opcua 库替换 CSV 输入变成在线监控- 加统计检测在阈值法基础上叠加 3-Sigma / IQR 法发现未超限但异常的渐变趋势- 多罐对比扩展为全罐区 Dashboard一眼看清哪座罐风险最高- 根因关联关联进料阀开度、出料泵频率自动推断异常原因免责声明本工具仅用于历史数据后分析不可替代 SIS 安全仪表系统的实时联锁功能。阈值设定应依据实际工艺安全文件和国家标准本工具提供的默认参数仅供参考。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛