如何在ElasticSearch+Kibana中统计污染物指标阈值触发次数?
环境监测数据超标次数统计解决方案(Elasticsearch + Kibana)
一、直接用Lens实现(推荐)
完全可以用Lens完成中位数/中位数移动平均值的超标次数统计,步骤如下:
1. 创建核心指标(中位数或中位数移动平均值)
- 打开Lens并选择目标环境监测索引
- 若统计中位数超标次数:添加「聚合指标」,选择「中位数」,关联污染物数值字段(如
pm25_value) - 若统计中位数移动平均值超标次数(符合欧盟24h/8h限值要求):
- 先按上述方式创建中位数指标
- 给该指标添加「移动窗口」转换,设置窗口大小(需匹配数据采集频率:比如每小时采集一次,24h窗口就设为24;每15分钟一次则设为96),时间单位选「数据点」
2. 构建超标次数统计
- 添加新的「聚合指标」,选择「计数」
- 给这个计数指标添加「过滤器」转换,设置过滤条件为:
[刚才创建的中位数/移动平均指标] > [法规限值](比如PM2.5 24h限值填25)
3. 按年份分组展示
- 在「分桶」区域添加「日期直方图」,选择时间字段,粒度设为「年」
- 可选:添加「术语」分桶,选择监测站字段,实现按站点拆分每年的超标次数
二、备选方案(Lens灵活性不足时)
1. 用Transform预处理数据
提前计算超标标记,简化后续统计:
- 进入Kibana的「Transform」页面,创建新的「pivot transform」
- 分组键选择:
监测站字段+日期直方图(按天/8h窗口,匹配法规时间要求) - 聚合项:
- 计算污染物的中位数
- 计算中位数的移动平均值(用
moving_avg聚合) - 添加脚本字段:
is_over_limit,脚本逻辑为doc['moving_avg_median'].value > 限值 ? 1 : 0
- 执行Transform生成新索引,之后直接在Lens中对新索引按年份sum
is_over_limit字段,即可得到每年超标次数
2. 用Discover+可视化构建器
- 打开Discover,添加过滤器:
[中位数/移动平均字段] > [限值](若移动平均未提前计算,可在Discover中添加运行时字段实现) - 点击「保存」后进入「可视化构建器」,选择「日期直方图」,时间粒度设为「年」,Y轴选「计数」,即可得到每年超标次数
3. Timelion(旧版Kibana可选)
用Timelion脚本直接计算并统计:
.es(index=your_monitor_index, q="pm25_moving_avg:>25").split(terms=station_id).timechart(sum=count).groupby('year')
注:需提前确保pm25_moving_avg是已计算好的字段或运行时字段
内容的提问来源于stack exchange,提问作者Bardo
相关产品推荐
相关产品推荐

