575 Stimmen

Wie finde ich die Zeitdifferenz zwischen zwei datetime-Objekten in Python?

Wie kann ich den Zeitunterschied in Minuten zwischen zwei datetime Objekte?

530voto

SilentGhost Punkte 285785
>>> import datetime
>>> first_time = datetime.datetime.now()
>>> later_time = datetime.datetime.now()
>>> difference = later_time - first_time
datetime.timedelta(0, 8, 562000)
>>> seconds_in_day = 24 * 60 * 60
>>> divmod(difference.days * seconds_in_day + difference.seconds, 60)
(0, 8)      # 0 minutes, 8 seconds

Subtraktion der späteren Zeit von der ersten Zeit difference = later_time - first_time erzeugt ein datetime-Objekt, das nur die Differenz enthält. Im obigen Beispiel beträgt sie 0 Minuten, 8 Sekunden und 562000 Mikrosekunden.

281voto

Attaque Punkte 5326

Beispiel mit datetime

>>> from datetime import datetime
>>> then = datetime(2012, 3, 5, 23, 8, 15)        # Random date in the past
>>> now  = datetime.now()                         # Now
>>> duration = now - then                         # For build-in functions
>>> duration_in_s = duration.total_seconds()      # Total number of seconds between dates

Dauer in Jahren

>>> years = divmod(duration_in_s, 31536000)[0]    # Seconds in a year=365*24*60*60 = 31536000.

Dauer in Tagen

>>> days  = duration.days                         # Build-in datetime function
>>> days  = divmod(duration_in_s, 86400)[0]       # Seconds in a day = 86400

Dauer in Stunden

>>> hours = divmod(duration_in_s, 3600)[0]        # Seconds in an hour = 3600

Dauer in Minuten

>>> minutes = divmod(duration_in_s, 60)[0]        # Seconds in a minute = 60

Dauer in Sekunden

[!] Siehe Warnung über die Verwendung der Dauer in Sekunden am Ende dieses Beitrags

>>> seconds = duration.seconds                    # Build-in datetime function
>>> seconds = duration_in_s

Dauer in Mikrosekunden

[Siehe Warnung über die Verwendung der Dauer in Mikrosekunden am Ende dieses Beitrags

>>> microseconds = duration.microseconds          # Build-in datetime function

Gesamtdauer zwischen den beiden Terminen

>>> days    = divmod(duration_in_s, 86400)        # Get days (without [0]!)
>>> hours   = divmod(days[1], 3600)               # Use remainder of days to calc hours
>>> minutes = divmod(hours[1], 60)                # Use remainder of hours to calc minutes
>>> seconds = divmod(minutes[1], 1)               # Use remainder of minutes to calc seconds
>>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))

oder einfach:

>>> print(now - then)

Bearbeiten 2019 Da sich diese Antwort durchgesetzt hat, füge ich eine Funktion hinzu, die die Verwendung für einige vereinfachen könnte

from datetime import datetime

def getDuration(then, now = datetime.now(), interval = "default"):

    # Returns a duration as specified by variable interval
    # Functions, except totalDuration, returns [quotient, remainder]

    duration = now - then # For build-in functions
    duration_in_s = duration.total_seconds() 

    def years():
      return divmod(duration_in_s, 31536000) # Seconds in a year=31536000.

    def days(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 86400) # Seconds in a day = 86400

    def hours(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 3600) # Seconds in an hour = 3600

    def minutes(seconds = None):
      return divmod(seconds if seconds != None else duration_in_s, 60) # Seconds in a minute = 60

    def seconds(seconds = None):
      if seconds != None:
        return divmod(seconds, 1)   
      return duration_in_s

    def totalDuration():
        y = years()
        d = days(y[1]) # Use remainder to calculate next variable
        h = hours(d[1])
        m = minutes(h[1])
        s = seconds(m[1])

        return "Time between dates: {} years, {} days, {} hours, {} minutes and {} seconds".format(int(y[0]), int(d[0]), int(h[0]), int(m[0]), int(s[0]))

    return {
        'years': int(years()[0]),
        'days': int(days()[0]),
        'hours': int(hours()[0]),
        'minutes': int(minutes()[0]),
        'seconds': int(seconds()),
        'default': totalDuration()
    }[interval]

# Example usage
then = datetime(2012, 3, 5, 23, 8, 15)
now = datetime.now()

print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds
print(getDuration(then, now, 'years'))      # Prints duration in years
print(getDuration(then, now, 'days'))       #                    days
print(getDuration(then, now, 'hours'))      #                    hours
print(getDuration(then, now, 'minutes'))    #                    minutes
print(getDuration(then, now, 'seconds'))    #                    seconds

Warnung: Warnung vor den eingebauten .seconds und .microseconds
datetime.seconds y datetime.microseconds sind auf [0,86400) bzw. [0,10^6) begrenzt.

Sie sollten mit Vorsicht verwendet werden, wenn timedelta größer ist als der maximal zurückgegebene Wert.

Beispiele:

end ist 1h und 200s nach start :

>>> start = datetime(2020,12,31,22,0,0,500)
>>> end = datetime(2020,12,31,23,0,0,700)
>>> delta = end - start
>>> delta.microseconds
RESULT: 200
EXPECTED: 3600000200

end ist 1d und 1h nach start :

>>> start = datetime(2020,12,30,22,0,0)
>>> end = datetime(2020,12,31,23,0,0)
>>> delta = end - start
>>> delta.seconds
RESULT: 3600
EXPECTED: 90000

170voto

Ryan Stanley Punkte 1779

Neu in Python 2.7 ist die timedelta Fallmethode .total_seconds() . Aus den Python-Dokumenten geht hervor, dass dies gleichbedeutend ist mit (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 .

Referenz: http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds

>>> import datetime
>>> time1 = datetime.datetime.now()
>>> time2 = datetime.datetime.now() # waited a few minutes before pressing enter
>>> elapsedTime = time2 - time1
>>> elapsedTime
datetime.timedelta(0, 125, 749430)
>>> divmod(elapsedTime.total_seconds(), 60)
(2.0, 5.749430000000004) # divmod returns quotient and remainder
# 2 minutes, 5.74943 seconds

61voto

Vinay Sajip Punkte 89444

Ziehen Sie einfach das eine vom anderen ab. Sie erhalten eine timedelta Objekt mit dem Unterschied.

>>> import datetime
>>> d1 = datetime.datetime.now()
>>> d2 = datetime.datetime.now() # after a 5-second or so pause
>>> d2 - d1
datetime.timedelta(0, 5, 203000)
>>> dd = d2 - d1
>>> print (dd.days) # get days
>>> print (dd.seconds) # get seconds
>>> print (dd.microseconds) # get microseconds
>>> print (int(round(dd.total_seconds()/60, 0))) # get minutes

37voto

jfs Punkte 370717

Si a , b datetime-Objekte sind, um die Zeitdifferenz zwischen ihnen in Python 3 zu ermitteln:

from datetime import timedelta

time_difference = a - b
time_difference_in_minutes = time_difference / timedelta(minutes=1)

Bei früheren Python-Versionen:

time_difference_in_minutes = time_difference.total_seconds() / 60

Si a , b sind naive Datetime-Objekte, wie sie von datetime.now() dann kann das Ergebnis falsch sein, wenn die Objekte die Ortszeit mit unterschiedlichen UTC-Offsets darstellen, z. B. bei Sommerzeitumstellungen oder für vergangene/zukünftige Daten. Mehr Details: Feststellen, ob 24 Stunden zwischen zwei Datumsangaben vergangen sind - Python .

Um zuverlässige Ergebnisse zu erhalten, verwenden Sie die UTC-Zeit oder zeitzonenkonforme Datetime-Objekte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X