计算更大时间范围内某些时期的价值增长 - 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,然后迭代以累积所有值,并确保由于过滤,数据不会突然出现颠簸。希望这对遇到此问题的人有所帮助!
我的架构
我有一个 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,然后迭代以累积所有值,并确保由于过滤,数据不会突然出现颠簸。希望这对遇到此问题的人有所帮助!