计算更大时间范围内某些时期的价值增长 - InfluxDB 2.0 (Flux)

Calculating Value Rise During Certain Periods Inside A Larger Time Frame - InfluxDB 2.0 (Flux)

我的架构

我有一个 Influx 2.0(使用 Flux)数据库,我在其中测量并写入我的整个生命周期用电量,随着千瓦时的增加而无限增加。

我想做什么

我想在用户选择的时间段(我们称之为 P1)中过滤掉日期(假设日期是 08:00 和 21:00,我们将这些时间段称为 P2)并显示在整个 P1 时间段内总共使用了多少 P2 时间段。

本质上,我会有很多范围,我想累加起来。

我尝试过的+问题

最初我有一个总能量使用量(包括 P2 周期之外的时间),我只是取 P1 周期结束时的最后一个值减去 P1 周期开始时的值。这让我得到了那段时间的总用电量,所以我开始修改查询。

我尝试了以下方法:

data = from(bucket: "default")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["entity_id"] == "home_total_kwh")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)

values = data |> first() |> findColumn(fn: (key) => true, column: "_value")

start_value = values[0]

data
  |> map(fn: (r) => ({ r with _value: r._value - start_value}))

但这有一个明显的问题,因为这只给出了那段时间的总数,然后我尝试使用以下行对其进行过滤,但我不确定之后要做什么:

  |> filter(fn: (r) => date.hour(t: r["_time"]) * 100 + date.minute(t: r["_time"]) < 2100 and date.hour(t: r["_time"]) * 100 + date.minute(t: r["_time"]) >= 800)

我希望我的最终结果是什么

输入:

time kWh
00:00 2
02:00 4
04:00 6
06:00 8
08:00 10
10:00 12
12:00 14
14:00 16
16:00 18
18:00 20
20:00 22
22:00 24
00:00 26
02:00 28

处理中:

time kWh
00:00 0
02:00 0
04:00 0
06:00 0
08:00 2
10:00 4
12:00 6
14:00 8
16:00 10
18:00 12
20:00 14
22:00 15
00:00 15
02:00 15

输出:

Total Used During Day: 15kWh


抱歉解释太长,感谢您的帮助:)

想通了!

import "date"

from(bucket: "default")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["entity_id"] == "home_total_kwh")
    |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
    |> map(fn: (r) => ({_value: if ((date.hour(t: r["_time"]) * 100 + date.minute(t: r["_time"])) < 2100 and (date.hour(t: r["_time"]) * 100 + date.minute(t: r["_time"])) >= 800) then r._value else 0.0}))
    |> reduce(
        fn: (r, accumulator) => ({
            sum: if (r._value != 0.0 and accumulator.prev != 0.0) then accumulator.sum + r._value - accumulator.prev else accumulator.sum,
            prev: r._value,
        }),
        identity: {sum: 0.0, prev: 0.0}
    )
    |> keep(columns: ["sum"])

我发现了如何遍历每一行,因此让我创建一个像这样的reduce函数,它将P2周期之外的所有值替换为0,然后迭代以累积所有值,并确保由于过滤,数据不会突然出现颠簸。希望这对遇到此问题的人有所帮助!