![](/img/trans.png)
[英]How can I calculate the time difference between two lists of dates/times using 365 day format in python?
[英]how can i calculate the difference between two dates and times in python
我的代码如下所示:
from datetime import datetime
namesFile = open("data.txt", "r")
listaDati = namesFile.readlines()
sensors_dict = {#i'm omitting what's wrote in here because it's not relevant}
listaDivisa = []
for i in listaDati:
if "T" not in i:
listaDivisa.append(
i.split())
for k, v in sensors_dict.items(): #mapping sensor's name with the ones in the dict
for i in listaDivisa:
if i[2] == k:
i[2] = v
for i in listaDivisa: #mapping in simply "on" and "off"
if i[3] in ["ON", "OPEN", "ON0", "ON`", "O"]:
i[3] = "ON"
elif i[3] in ["OFF", "CLOSE"]:
i[3] = "OFF"
listaDivisa 看起来像这样:
['2009-10-16', '21:06:34.00044', 'kitchen sensor', 'ON']
['2009-10-16', '21:13:22.00016, 'kitchen sensor', 'OFF']
['2009-10-16', '12:53:29.00004', 'bathroom sensor', 'ON']
['2009-10-16', '14:02:51.00056, 'bathroom sensor', 'OFF']
... and so on
我想计算传感器开启的时间(以分钟为单位),我尝试这样做:
def differenza():
for p, j in enumerate(listaDivisa[:-1]):
if j[2] == listaDivisa[p + 1][2]:
if j[3] == "ON" and listaDivisa[p + 1][3] == "OFF":
tempo1 = j[0] + " " + j[1]
tempo2 = listaDivisa[p + 1][0] + " " + listaDivisa[p + 1][1]
d1 = datetime.strptime(tempo1, '%Y-%m-%d %H:%M:%S.%f')
d2 = datetime.strptime(tempo2, '%Y-%m-%d %H:%M:%S.%f')
return abs((d2 - d1).seconds)
listaDict = {}
for i in listaDivisa:
if i[0] not in listaDict.keys():
listaDict[i[2]] = dict()
r = differenza()
listaDict[i[2]][i[0]] = "day " + i[0] + " sensor have been active for " + str(r) + " seconds"
for key, value in listaDict.items():
print(key, ' : ', value)
但它不起作用,我尝试过的另一个原始替代方案是
def differenza():
for i in range(len(listaDivisa)):
for j in range(i + 1, len(listaDivisa)):
if listaDivisa[i][2] == listaDivisa[j][2]:
if listaDivisa[i][3] == "ON" and listaDivisa[j][3] == "OFF":
timeStart = listaDivisa[i][1].split(":")
timeFinish= listaDivisa[j][1].split(
":")
time1 = [int((timeStart[0] * 3600)), int((timeStart[1] * 60))]
time2= [int((timeFinish[0] * 3600)), int((timeFinish[1] * 60))]
secondsStart= sum(time1)
secondsFinish= sum(time2)
secondsDifference= secondsFinish - secondsStart
minutes= secondsDifference / 60
ris = "Sensor active for " + str(minutes) + " minutes"
return ris
但是,不介意它甚至不起作用的事实,我认为它不是一个聪明的选择。
我怎么能那样做? 谢谢
忽略 OP 代码中 listaDivisa 的构造方式,这可能会有所帮助:
from datetime import datetime
listaDivisa = [['2009-10-16', '21:06:34.00044', 'kitchen sensor', 'ON'],
['2009-10-16', '21:13:22.00016', 'kitchen sensor', 'OFF'],
['2009-10-16', '12:53:29.00004', 'bathroom sensor', 'ON'],
['2009-10-16', '14:02:51.00056', 'bathroom sensor', 'OFF']]
results = {}
for date_, time_, sensor_, state_ in listaDivisa:
dt = datetime.strptime(f'{date_}{time_}', '%Y-%m-%d%H:%M:%S.%f')
results.setdefault(sensor_, {})[state_] = dt
for k, v in results.items():
if 'ON' in v and 'OFF' in v:
print(k, (v['OFF']-v['ON']).seconds)
Output:
kitchen sensor 407
bathroom sensor 4162
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.