计算传感器每天处于特定状态的时间

Calculating amount of time per day a sensor is in a specific state

我有几个传感器经常向 InfluxDB 报告它们的状态。我现在想获得传感器状态每天打开 (1) 的小时数。该图如下所示:

我的 Python 脚本如下所示:

from influxdb_client import InfluxDBClient
import pandas as pd

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_colwidth', None)

token = 'XXX'
org = 'XXX'
bucket = 'XXX'
query= '''
from(bucket: "XXX")
  |> range(start:-6h)
  |> filter(fn: (r) => r["name"] == "sensor1")
  |> filter(fn: (r) => r["_measurement"] == "undefined")
  |> filter(fn: (r) => r["_field"] == "STATE")
  |> toInt()
'''

client = InfluxDBClient(url='https://westeurope-1.azure.cloud2.influxdata.com', token=token, org=org, debug=False)
df = client.query_api().query_data_frame(org=org, query=query)
df = df.reindex(columns=['_value', '_time'])
display(df)
_value  _time
0   1   2021-11-12 13:22:32+00:00
1   0   2021-11-12 13:22:34+00:00
2   0   2021-11-12 13:26:32+00:00
3   0   2021-11-12 13:26:34+00:00
4   1   2021-11-12 13:28:05+00:00
5   0   2021-11-12 13:28:06+00:00
6   0   2021-11-12 13:29:04+00:00
7   0   2021-11-12 13:29:06+00:00
8   1   2021-11-12 13:39:04+00:00
9   0   2021-11-12 13:39:06+00:00
10  0   2021-11-12 13:41:09+00:00
11  0   2021-11-12 13:41:10+00:00
12  1   2021-11-12 13:52:33+00:00
13  0   2021-11-12 13:52:34+00:00
14  0   2021-11-12 14:00:08+00:00
15  0   2021-11-12 14:00:10+00:00
16  1   2021-11-12 14:07:32+00:00
17  0   2021-11-12 14:07:34+00:00
18  1   2021-11-12 14:17:52+00:00
19  0   2021-11-12 14:17:53+00:00
20  0   2021-11-12 14:18:45+00:00
21  0   2021-11-12 14:18:46+00:00
22  1   2021-11-12 14:22:33+00:00
23  0   2021-11-12 14:22:34+00:00
24  0   2021-11-12 14:32:05+00:00
25  0   2021-11-12 14:32:06+00:00
26  0   2021-11-12 14:33:06+00:00
27  0   2021-11-12 14:33:45+00:00
28  0   2021-11-12 14:33:46+00:00
29  1   2021-11-12 14:37:33+00:00
30  0   2021-11-12 14:37:34+00:00
31  0   2021-11-12 14:48:20+00:00
32  0   2021-11-12 14:48:21+00:00
33  1   2021-11-12 14:52:33+00:00
34  0   2021-11-12 14:52:34+00:00
35  0   2021-11-12 14:56:04+00:00
36  0   2021-11-12 14:56:06+00:00
37  0   2021-11-12 14:57:55+00:00
38  0   2021-11-12 14:57:56+00:00
39  1   2021-11-12 15:22:33+00:00
40  0   2021-11-12 15:22:34+00:00
41  0   2021-11-12 15:23:04+00:00
42  0   2021-11-12 15:23:06+00:00
43  1   2021-11-12 15:26:04+00:00
44  0   2021-11-12 15:26:06+00:00
45  0   2021-11-12 15:26:33+00:00
46  0   2021-11-12 15:26:34+00:00
47  1   2021-11-12 15:37:32+00:00
48  0   2021-11-12 15:37:34+00:00
49  0   2021-11-12 15:41:05+00:00
50  0   2021-11-12 15:41:06+00:00
51  1   2021-11-12 15:52:32+00:00
52  0   2021-11-12 15:52:34+00:00
53  1   2021-11-12 16:03:13+00:00
54  0   2021-11-12 16:03:14+00:00
55  0   2021-11-12 16:20:04+00:00
56  0   2021-11-12 16:20:06+00:00
57  1   2021-11-12 16:22:05+00:00
58  0   2021-11-12 16:37:04+00:00
59  0   2021-11-12 16:37:06+00:00
60  1   2021-11-12 16:37:33+00:00
61  0   2021-11-12 16:37:34+00:00
62  0   2021-11-12 16:43:05+00:00
63  0   2021-11-12 16:43:06+00:00
64  0   2021-11-12 16:43:51+00:00
65  0   2021-11-12 16:43:53+00:00
66  1   2021-11-12 16:56:05+00:00
67  0   2021-11-12 16:56:06+00:00
68  0   2021-11-12 16:56:32+00:00
69  0   2021-11-12 16:56:34+00:00
70  1   2021-11-12 17:07:33+00:00
71  1   2021-11-12 17:07:34+00:00
72  0   2021-11-12 17:08:05+00:00
73  0   2021-11-12 17:08:06+00:00
74  1   2021-11-12 17:10:05+00:00
75  0   2021-11-12 17:10:06+00:00
76  0   2021-11-12 17:11:09+00:00
77  0   2021-11-12 17:11:10+00:00
78  1   2021-11-12 17:22:32+00:00
79  0   2021-11-12 17:22:33+00:00
80  1   2021-11-12 17:22:45+00:00
81  1   2021-11-12 17:24:08+00:00
82  0   2021-11-12 17:24:13+00:00
83  0   2021-11-12 17:24:14+00:00
84  1   2021-11-12 17:25:05+00:00
85  0   2021-11-12 17:25:06+00:00
86  0   2021-11-12 18:14:37+00:00
87  0   2021-11-12 18:14:38+00:00
88  0   2021-11-12 18:45:44+00:00
89  0   2021-11-12 18:45:46+00:00
df['end'] = df['_time'].shift(-1)
df['duration'] = df['end'] - df['_time']
display(df)
_value  _time   end duration
0   1   2021-11-12 13:22:32+00:00   2021-11-12 13:22:34+00:00   0 days 00:00:02
1   0   2021-11-12 13:22:34+00:00   2021-11-12 13:26:32+00:00   0 days 00:03:58
2   0   2021-11-12 13:26:32+00:00   2021-11-12 13:26:34+00:00   0 days 00:00:02
3   0   2021-11-12 13:26:34+00:00   2021-11-12 13:28:05+00:00   0 days 00:01:31
4   1   2021-11-12 13:28:05+00:00   2021-11-12 13:28:06+00:00   0 days 00:00:01
5   0   2021-11-12 13:28:06+00:00   2021-11-12 13:29:04+00:00   0 days 00:00:58
6   0   2021-11-12 13:29:04+00:00   2021-11-12 13:29:06+00:00   0 days 00:00:02
7   0   2021-11-12 13:29:06+00:00   2021-11-12 13:39:04+00:00   0 days 00:09:58
8   1   2021-11-12 13:39:04+00:00   2021-11-12 13:39:06+00:00   0 days 00:00:02
9   0   2021-11-12 13:39:06+00:00   2021-11-12 13:41:09+00:00   0 days 00:02:03
10  0   2021-11-12 13:41:09+00:00   2021-11-12 13:41:10+00:00   0 days 00:00:01
11  0   2021-11-12 13:41:10+00:00   2021-11-12 13:52:33+00:00   0 days 00:11:23
12  1   2021-11-12 13:52:33+00:00   2021-11-12 13:52:34+00:00   0 days 00:00:01
13  0   2021-11-12 13:52:34+00:00   2021-11-12 14:00:08+00:00   0 days 00:07:34
14  0   2021-11-12 14:00:08+00:00   2021-11-12 14:00:10+00:00   0 days 00:00:02
15  0   2021-11-12 14:00:10+00:00   2021-11-12 14:07:32+00:00   0 days 00:07:22
16  1   2021-11-12 14:07:32+00:00   2021-11-12 14:07:34+00:00   0 days 00:00:02
17  0   2021-11-12 14:07:34+00:00   2021-11-12 14:17:52+00:00   0 days 00:10:18
18  1   2021-11-12 14:17:52+00:00   2021-11-12 14:17:53+00:00   0 days 00:00:01
19  0   2021-11-12 14:17:53+00:00   2021-11-12 14:18:45+00:00   0 days 00:00:52
20  0   2021-11-12 14:18:45+00:00   2021-11-12 14:18:46+00:00   0 days 00:00:01
21  0   2021-11-12 14:18:46+00:00   2021-11-12 14:22:33+00:00   0 days 00:03:47
22  1   2021-11-12 14:22:33+00:00   2021-11-12 14:22:34+00:00   0 days 00:00:01
23  0   2021-11-12 14:22:34+00:00   2021-11-12 14:32:05+00:00   0 days 00:09:31
24  0   2021-11-12 14:32:05+00:00   2021-11-12 14:32:06+00:00   0 days 00:00:01
25  0   2021-11-12 14:32:06+00:00   2021-11-12 14:33:06+00:00   0 days 00:01:00
26  0   2021-11-12 14:33:06+00:00   2021-11-12 14:33:45+00:00   0 days 00:00:39
27  0   2021-11-12 14:33:45+00:00   2021-11-12 14:33:46+00:00   0 days 00:00:01
28  0   2021-11-12 14:33:46+00:00   2021-11-12 14:37:33+00:00   0 days 00:03:47
29  1   2021-11-12 14:37:33+00:00   2021-11-12 14:37:34+00:00   0 days 00:00:01
30  0   2021-11-12 14:37:34+00:00   2021-11-12 14:48:20+00:00   0 days 00:10:46
31  0   2021-11-12 14:48:20+00:00   2021-11-12 14:48:21+00:00   0 days 00:00:01
32  0   2021-11-12 14:48:21+00:00   2021-11-12 14:52:33+00:00   0 days 00:04:12
33  1   2021-11-12 14:52:33+00:00   2021-11-12 14:52:34+00:00   0 days 00:00:01
34  0   2021-11-12 14:52:34+00:00   2021-11-12 14:56:04+00:00   0 days 00:03:30
35  0   2021-11-12 14:56:04+00:00   2021-11-12 14:56:06+00:00   0 days 00:00:02
36  0   2021-11-12 14:56:06+00:00   2021-11-12 14:57:55+00:00   0 days 00:01:49
37  0   2021-11-12 14:57:55+00:00   2021-11-12 14:57:56+00:00   0 days 00:00:01
38  0   2021-11-12 14:57:56+00:00   2021-11-12 15:22:33+00:00   0 days 00:24:37
39  1   2021-11-12 15:22:33+00:00   2021-11-12 15:22:34+00:00   0 days 00:00:01
40  0   2021-11-12 15:22:34+00:00   2021-11-12 15:23:04+00:00   0 days 00:00:30
41  0   2021-11-12 15:23:04+00:00   2021-11-12 15:23:06+00:00   0 days 00:00:02
42  0   2021-11-12 15:23:06+00:00   2021-11-12 15:26:04+00:00   0 days 00:02:58
43  1   2021-11-12 15:26:04+00:00   2021-11-12 15:26:06+00:00   0 days 00:00:02
44  0   2021-11-12 15:26:06+00:00   2021-11-12 15:26:33+00:00   0 days 00:00:27
45  0   2021-11-12 15:26:33+00:00   2021-11-12 15:26:34+00:00   0 days 00:00:01
46  0   2021-11-12 15:26:34+00:00   2021-11-12 15:37:32+00:00   0 days 00:10:58
47  1   2021-11-12 15:37:32+00:00   2021-11-12 15:37:34+00:00   0 days 00:00:02
48  0   2021-11-12 15:37:34+00:00   2021-11-12 15:41:05+00:00   0 days 00:03:31
49  0   2021-11-12 15:41:05+00:00   2021-11-12 15:41:06+00:00   0 days 00:00:01
50  0   2021-11-12 15:41:06+00:00   2021-11-12 15:52:32+00:00   0 days 00:11:26
51  1   2021-11-12 15:52:32+00:00   2021-11-12 15:52:34+00:00   0 days 00:00:02
52  0   2021-11-12 15:52:34+00:00   2021-11-12 16:03:13+00:00   0 days 00:10:39
53  1   2021-11-12 16:03:13+00:00   2021-11-12 16:03:14+00:00   0 days 00:00:01
54  0   2021-11-12 16:03:14+00:00   2021-11-12 16:20:04+00:00   0 days 00:16:50
55  0   2021-11-12 16:20:04+00:00   2021-11-12 16:20:06+00:00   0 days 00:00:02
56  0   2021-11-12 16:20:06+00:00   2021-11-12 16:22:05+00:00   0 days 00:01:59
57  1   2021-11-12 16:22:05+00:00   2021-11-12 16:37:04+00:00   0 days 00:14:59
58  0   2021-11-12 16:37:04+00:00   2021-11-12 16:37:06+00:00   0 days 00:00:02
59  0   2021-11-12 16:37:06+00:00   2021-11-12 16:37:33+00:00   0 days 00:00:27
60  1   2021-11-12 16:37:33+00:00   2021-11-12 16:37:34+00:00   0 days 00:00:01
61  0   2021-11-12 16:37:34+00:00   2021-11-12 16:43:05+00:00   0 days 00:05:31
62  0   2021-11-12 16:43:05+00:00   2021-11-12 16:43:06+00:00   0 days 00:00:01
63  0   2021-11-12 16:43:06+00:00   2021-11-12 16:43:51+00:00   0 days 00:00:45
64  0   2021-11-12 16:43:51+00:00   2021-11-12 16:43:53+00:00   0 days 00:00:02
65  0   2021-11-12 16:43:53+00:00   2021-11-12 16:56:05+00:00   0 days 00:12:12
66  1   2021-11-12 16:56:05+00:00   2021-11-12 16:56:06+00:00   0 days 00:00:01
67  0   2021-11-12 16:56:06+00:00   2021-11-12 16:56:32+00:00   0 days 00:00:26
68  0   2021-11-12 16:56:32+00:00   2021-11-12 16:56:34+00:00   0 days 00:00:02
69  0   2021-11-12 16:56:34+00:00   2021-11-12 17:07:33+00:00   0 days 00:10:59
70  1   2021-11-12 17:07:33+00:00   2021-11-12 17:07:34+00:00   0 days 00:00:01
71  1   2021-11-12 17:07:34+00:00   2021-11-12 17:08:05+00:00   0 days 00:00:31
72  0   2021-11-12 17:08:05+00:00   2021-11-12 17:08:06+00:00   0 days 00:00:01
73  0   2021-11-12 17:08:06+00:00   2021-11-12 17:10:05+00:00   0 days 00:01:59
74  1   2021-11-12 17:10:05+00:00   2021-11-12 17:10:06+00:00   0 days 00:00:01
75  0   2021-11-12 17:10:06+00:00   2021-11-12 17:11:09+00:00   0 days 00:01:03
76  0   2021-11-12 17:11:09+00:00   2021-11-12 17:11:10+00:00   0 days 00:00:01
77  0   2021-11-12 17:11:10+00:00   2021-11-12 17:22:32+00:00   0 days 00:11:22
78  1   2021-11-12 17:22:32+00:00   2021-11-12 17:22:33+00:00   0 days 00:00:01
79  0   2021-11-12 17:22:33+00:00   2021-11-12 17:22:45+00:00   0 days 00:00:12
80  1   2021-11-12 17:22:45+00:00   2021-11-12 17:24:08+00:00   0 days 00:01:23
81  1   2021-11-12 17:24:08+00:00   2021-11-12 17:24:13+00:00   0 days 00:00:05
82  0   2021-11-12 17:24:13+00:00   2021-11-12 17:24:14+00:00   0 days 00:00:01
83  0   2021-11-12 17:24:14+00:00   2021-11-12 17:25:05+00:00   0 days 00:00:51
84  1   2021-11-12 17:25:05+00:00   2021-11-12 17:25:06+00:00   0 days 00:00:01
85  0   2021-11-12 17:25:06+00:00   2021-11-12 18:14:37+00:00   0 days 00:49:31
86  0   2021-11-12 18:14:37+00:00   2021-11-12 18:14:38+00:00   0 days 00:00:01
87  0   2021-11-12 18:14:38+00:00   2021-11-12 18:45:44+00:00   0 days 00:31:06
88  0   2021-11-12 18:45:44+00:00   2021-11-12 18:45:46+00:00   0 days 00:00:02
89  0   2021-11-12 18:45:46+00:00   NaT NaT
print('ON State: {}'.format(df.query('_value == 1')['duration'].sum()))
print('OFF State: {}'.format(df.query('_value == 0')['duration'].sum()))
ON State: 0 days 00:17:24
OFF State: 0 days 05:05:50

正如您在上方看到的,传感器在过去 6 小时内开启了大约 17 分钟,这显然是错误的,正如您在图表中看到的那样。为什么会这样?有人可以帮我找到问题吗?

非常感谢!

我怀疑你换错方向了:

# instead of .shift(1), .shift(-1)
# and change name appropriately
df['_start'] = df._time.shift(1)
# not really necessary to explicitly call pd.to_timedelta
# but makes it clear what's happening
df['_duration'] = pd.to_timedelta(df._time - df._start)
print(f'ON:  {df.loc[df._value.eq(1)]._duration.sum()}')
print(f'OFF: {df.loc[df._value.eq(0)]._duration.sum()}')

给予

ON:  0 days 02:34:21
OFF: 0 days 02:48:53