如何用InfluxDB的Flux分析日均能耗分布并可视化?
日均能耗时段分析与可视化方案
改造后的Flux查询
要实现按每天5分钟时段(共288个时段)计算均值、中位数等统计值,需在原有查询基础上添加时段分组与聚合逻辑,具体查询如下:
from(bucket: "Energie") |> range(start: -7d) |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer") |> filter(fn: (r) => r["topic"] == "energie/haushalt_hm/IEC_POWER") // 按5分钟窗口聚合原始数据,得到每个区间的平均能耗 |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) // 生成时段标识:易读的HH:mm格式 + 数值型分钟数(用于排序) |> map(fn: (r) => ({ r with interval: time.format(t: time.truncate(t: r._time, every: 5m), format: "%H:%M"), interval_min: uint(v: hour(t: r._time)) * 60 + uint(v: minute(t: r._time)) }) ) // 按时段分组,计算该时段的均值、中位数 |> group(columns: ["interval", "interval_min"]) |> aggregateWindow(every: inf, fn: mean, column: "_value", alias: "mean_power") |> aggregateWindow(every: inf, fn: median, column: "_value", alias: "median_power") // 按时段顺序排序,保证图表展示逻辑正确 |> sort(columns: ["interval_min"]) |> keep(columns: ["interval", "interval_min", "mean_power", "median_power"])
查询逻辑说明
- 基础数据处理:保留原有过滤与5分钟窗口聚合,确保每个数据点是对应时段的平均能耗;
- 时段标识生成:通过
map生成两类时段标签,interval用于可视化时的易读展示,interval_min用于避免字符串排序的逻辑错误; - 分组聚合:按时段分组后,用
every: inf对全周期同时段数据做聚合,得到该时段的均值、中位数; - 排序与字段筛选:按数值型时段排序,仅保留可视化所需字段。
可视化配置(以InfluxDB UI为例)
- 图表类型选择:优先选择折线图(展示趋势)或柱状图(对比时段差异);
- 轴配置:
- X轴:选择
interval作为展示字段,设置排序依据为interval_min,确保时段从00:00到23:55依次排列; - Y轴:添加
mean_power和median_power两个字段,可通过不同颜色区分,直观对比均值与中位数的差异;
- X轴:选择
- 扩展极值展示:若需查看每个时段的能耗波动范围,可在查询中添加极值聚合:
可视化时可添加极值线条,或用区域图展示|> aggregateWindow(every: inf, fn: max, column: "_value", alias: "max_power") |> aggregateWindow(every: inf, fn: min, column: "_value", alias: "min_power")min_power到max_power的波动区间。
注意事项
- 数据完整性:若存在时段数据缺失,可将
aggregateWindow中的createEmpty: false改为true,确保每个时段都有数据点(缺失值会填充null,聚合时自动忽略); - 样本周期:可调整
range(start: -7d)为更长周期(如-30d),获取更具代表性的统计结果; - 日期类型区分:若需对比工作日与周末的能耗差异,可在
map步骤添加weekday字段,分组时纳入该字段即可实现分类分析。
内容的提问来源于stack exchange,提问作者Twonky
相关产品推荐
相关产品推荐

