Frage subtrahiere zweimal in Python


ich habe zwei datetime.time Werte, exit und enter und ich möchte etwas tun wie:

duration = exit - enter

Allerdings bekomme ich diesen Fehler:

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time

Wie mache ich das richtig? Eine mögliche Lösung ist die Umwandlung der time Variablen zu datetime Variablen und dann substruct, aber ich bin sicher, dass Sie einen besseren und saubereren Weg haben müssen.


75
2018-03-10 12:55


Ursprung


Antworten:


Versuche dies:

from datetime import datetime, date

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)

combine Erstellt eine Datetime, die subtrahiert werden kann.


63
2018-03-10 12:58



Benutzen:

from datetime import datetime, date

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)

Verwenden date.min ist etwas prägnanter und funktioniert sogar um Mitternacht.

Dies ist möglicherweise nicht der Fall bei date.today() Dies kann zu unerwarteten Ergebnissen führen, wenn der erste Anruf um 23:59:59 und der nächste um 00:00:00 stattfindet.


26
2017-09-23 01:07



datetime.time unterstützt dies nicht, weil es fast sinnlos ist, Zeiten auf diese Weise zu subtrahieren. Verwenden Sie eine vollständige datetime.datetime wenn du das machen willst.


4
2018-03-10 12:57



import datetime

def diff_times_in_seconds(t1, t2):
    # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1
    h1, m1, s1 = t1.hour, t1.minute, t1.second
    h2, m2, s2 = t2.hour, t2.minute, t2.second
    t1_secs = s1 + 60 * (m1 + 60*h1)
    t2_secs = s2 + 60 * (m2 + 60*h2)
    return( t2_secs - t1_secs)

# using it
diff_times_in_seconds( datetime.datetime.strptime( "13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime( "14:02:39", '%H:%M:%S').time())

4
2018-04-10 11:37



Anstatt die Zeit zu nutzen, versuchen Sie es mit timedelta:

from datetime import timedelta

t1 = timedelta(hours=7, minutes=36)
t2 = timedelta(hours=11, minutes=32)
t3 = timedelta(hours=13, minutes=7)
t4 = timedelta(hours=21, minutes=0)

arrival = t2 - t1
lunch = (t3 - t2 - timedelta(hours=1))
departure = t4 - t3

print(arrival, lunch, departure)

4
2017-07-07 12:26



Der Python Zeitdelta Bibliothek sollte tun, was Sie brauchen. EIN timedelta wird zurückgegeben, wenn Sie zwei subtrahieren datetime Instanzen.

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())

3
2017-11-08 17:04



Ich hatte eine ähnliche Situation, als Sie und ich am Ende mit der externen Bibliothek genannt Pfeil.

So sieht es aus:

>>> import arrow
>>> enter = arrow.get('12:30:45', 'HH:mm:ss')
>>> exit = arrow.now()
>>> duration = exit - enter
>>> duration
datetime.timedelta(736225, 14377, 757451)

2
2017-09-19 16:35



Sie haben zwei datetime.time-Objekte, also erstellen Sie einfach zwei timedelta mit datetime.timedetla und subtrahieren Sie dann wie Sie jetzt mit "-" Operand. Im Folgenden finden Sie eine Beispielmethode zum zweimaligen Subtrahieren ohne Verwendung von datetime.

enter = datetime.time(hour=1)  # Example enter time
exit = datetime.time(hour=2)  # Example start time
enter_delta = datetime.timedelta(hours=enter.hour, minutes=enter.minute, seconds=enter.second)
exit_delta = datetime.timedelta(hours=exit.hour, minutes=exit.minute, seconds=exit.second)
difference_delta = exit_delta - enter_delta

Unterschied_Delta ist Ihr Unterschied, den Sie für Ihre Gründe verwenden können.


1
2018-03-28 07:41