my code looks like this:
JavaScript
x
23
23
1
from datetime import datetime
2
3
namesFile = open("data.txt", "r")
4
listaDati = namesFile.readlines()
5
6
sensors_dict = {#i'm omitting what's wrote in here because it's not relevant}
7
8
listaDivisa = []
9
for i in listaDati:
10
if "T" not in i:
11
listaDivisa.append(
12
i.split())
13
14
for k, v in sensors_dict.items(): #mapping sensor's name with the ones in the dict
15
for i in listaDivisa:
16
if i[2] == k:
17
i[2] = v
18
for i in listaDivisa: #mapping in simply "on" and "off"
19
if i[3] in ["ON", "OPEN", "ON0", "ON`", "O"]:
20
i[3] = "ON"
21
elif i[3] in ["OFF", "CLOSE"]:
22
i[3] = "OFF"
23
listaDivisa looks like this:
JavaScript
1
7
1
['2009-10-16', '21:06:34.00044', 'kitchen sensor', 'ON']
2
['2009-10-16', '21:13:22.00016, 'kitchen sensor', 'OFF']
3
['2009-10-16', '12:53:29.00004', 'bathroom sensor', 'ON']
4
['2009-10-16', '14:02:51.00056, 'bathroom sensor', 'OFF']
5
6
and so on
7
I want to calculate how much time (better in minutes) the sensor was ON, I tried doing this:
JavaScript
1
24
24
1
def differenza():
2
for p, j in enumerate(listaDivisa[:-1]):
3
if j[2] == listaDivisa[p + 1][2]:
4
if j[3] == "ON" and listaDivisa[p + 1][3] == "OFF":
5
tempo1 = j[0] + " " + j[1]
6
tempo2 = listaDivisa[p + 1][0] + " " + listaDivisa[p + 1][1]
7
8
d1 = datetime.strptime(tempo1, '%Y-%m-%d %H:%M:%S.%f')
9
d2 = datetime.strptime(tempo2, '%Y-%m-%d %H:%M:%S.%f')
10
11
return abs((d2 - d1).seconds)
12
13
14
listaDict = {}
15
for i in listaDivisa:
16
if i[0] not in listaDict.keys():
17
listaDict[i[2]] = dict()
18
19
r = differenza()
20
listaDict[i[2]][i[0]] = "day " + i[0] + " sensor have been active for " + str(r) + " seconds"
21
22
for key, value in listaDict.items():
23
print(key, ' : ', value)
24
but it doesn’t work, another raw alternative I tried was
JavaScript
1
18
18
1
def differenza():
2
for i in range(len(listaDivisa)):
3
for j in range(i + 1, len(listaDivisa)):
4
if listaDivisa[i][2] == listaDivisa[j][2]:
5
if listaDivisa[i][3] == "ON" and listaDivisa[j][3] == "OFF":
6
timeStart = listaDivisa[i][1].split(":")
7
timeFinish= listaDivisa[j][1].split(
8
":")
9
time1 = [int((timeStart[0] * 3600)), int((timeStart[1] * 60))]
10
time2= [int((timeFinish[0] * 3600)), int((timeFinish[1] * 60))]
11
secondsStart= sum(time1)
12
secondsFinish= sum(time2)
13
secondsDifference= secondsFinish - secondsStart
14
minutes= secondsDifference / 60
15
16
ris = "Sensor active for " + str(minutes) + " minutes"
17
return ris
18
but, not minding about the fact that it doesn’t even work, I don’t think it could be a smart alternative.
How could I do that? Thank you
Advertisement
Answer
Ignoring how listaDivisa is constructed in OP’s code then this may help:
JavaScript
1
24
24
1
from datetime import datetime
2
3
ON = 'ON'
4
OFF = 'OFF'
5
6
listaDivisa = [['2009-10-16', '21:06:34.00044', 'kitchen sensor', 'ON'],
7
['2009-10-16', '21:13:22.00016', 'kitchen sensor', 'OFF'],
8
['2009-10-16', '12:53:29', 'bathroom sensor', 'ON'],
9
['2009-10-16', '14:02:51.00056', 'bathroom sensor', 'OFF']]
10
11
results = {}
12
13
for date_, time_, sensor_, state_ in listaDivisa:
14
for fmt in '%Y-%m-%d%H:%M:%S.%f', '%Y-%m-%d%H:%M:%S':
15
try:
16
results.setdefault(sensor_, {})[state_] = datetime.strptime(f'{date_}{time_}', fmt)
17
break
18
except ValueError:
19
pass
20
21
for k, v in results.items():
22
if ON in v and OFF in v:
23
print(k, (v[OFF]-v[ON]).seconds)
24
Output:
JavaScript
1
3
1
kitchen sensor 407
2
bathroom sensor 4162
3