web-dev-qa-db-fra.com

Comment trouver la différence de temps entre deux objets datetime en python?

Comment puis-je indiquer la différence de temps en minutes entre deux objets datetime?

236
Hobhouse
>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a
datetime.timedelta(0, 8, 562000)
>>> divmod(c.days * 86400 + c.seconds, 60)
(0, 8)      # 0 minutes, 8 seconds
267
SilentGhost

La nouveauté de Python 2.7 est la méthode d'instance timedelta.total_seconds(). Dans les documents Python, cela équivaut à (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6.

Référence: 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
126
Ryan Stanley

Il suffit de soustraire l’un de l’autre. Vous obtenez un objet timedelta avec la différence.

>>> import datetime
>>> d1 = datetime.datetime.now()
>>> d2 = datetime.datetime.now() # after a 5-second or so pause
>>> d2 - d1
datetime.timedelta(0, 5, 203000)

Vous pouvez convertir dd.days, dd.seconds et dd.microseconds en minutes.

25
Vinay Sajip

Exemple d'utilisation de date/heure

>>> 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

Durée en années

>>> years = divmod(duration_in_s, 31556926)[0]    # Seconds in a year=31556926.

Durée en jours

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

Durée en heures

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

Durée en minutes

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

Durée en secondes

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

Durée en microsecondes

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

Durée totale entre les deux dates

>>> 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]))

ou simplement:

>>> print(now - then)
21
Attaque

Si a, b sont des objets datetime, recherchez la différence de temps entre eux dans Python 3:

from datetime import timedelta

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

Sur les versions antérieures de Python:

time_difference_in_minutes = time_difference.total_seconds() / 60

Si a, b sont des objets date-heure naïfs tels que renvoyés par datetime.now(), le résultat peut être erroné si les objets représentent l'heure locale avec des décalages UTC différents, par exemple autour des transitions DST ou des dates passées/futures. Plus de détails: Trouvez si 24 heures se sont écoulées entre deux heures - Python .

Pour obtenir des résultats fiables, utilisez les objets d'heure UTC ou de datetime.

19
jfs

Utilisez divmod:

now = int(time.time()) # Epoch seconds
then = now - 90000 # some time in the past

d = divmod(now-then,86400)  # days
h = divmod(d[1],3600)  # hours
m = divmod(h[1],60)  # minutes
s = m[1]  # seconds

print '%d days, %d hours, %d minutes, %d seconds' % (d[0],h[0],m[0],s)
17
tgwaste

Voici comment obtenir le nombre d'heures écoulées entre deux objets datetime.datetime:

before = datetime.datetime.now()
after  = datetime.datetime.now()
hours  = math.floor(((after - before).seconds) / 3600)
7
Tony

Pour trouver simplement le nombre de jours: timedelta a un attribut 'days'. Vous pouvez simplement interroger cela.

>>>from datetime import datetime, timedelta
>>>d1 = datetime(2015, 9, 12, 13, 9, 45)
>>>d2 = datetime(2015, 8, 29, 21, 10, 12)
>>>d3 = d1- d2
>>>print d3
13 days, 15:59:33
>>>print d3.days
13
6
griknus17

J'utilise quelque chose comme ça:

from datetime import datetime

def check_time_difference(t1: datetime, t2: datetime):
    t1_date = datetime(
        t1.year,
        t1.month,
        t1.day,
        t1.hour,
        t1.minute,
        t1.second)

    t2_date = datetime(
        t2.year,
        t2.month,
        t2.day,
        t2.hour,
        t2.minute,
        t2.second)

    t_elapsed = t1_date - t2_date

    return t_elapsed

# usage 
f = "%Y-%m-%d %H:%M:%S+01:00"
t1 = datetime.strptime("2018-03-07 22:56:57+01:00", f)
t2 = datetime.strptime("2018-03-07 22:48:05+01:00", f)
elapsed_time = check_time_difference(t1, t2)

print(elapsed_time)
#return : 0:08:52
2
Softmixt

Je pensais qu'il serait peut-être utile de mentionner également le formatage de timedelta. strptime () analyse une chaîne représentant une heure selon un format.

import datetime
from datetime import timedelta

datetimeFormat = '%Y/%m/%d %H:%M:%S.%f'    
time1 = '2016/03/16 10:01:28.585'
time2 = '2016/03/16 09:56:28.067'  
timedelta = datetime.datetime.strptime(time1, datetimeFormat) - datetime.datetime.strptime(time2,datetimeFormat)

Cela produira: 0: 05: 00.518000

2
sparrow

c'est pour trouver la différence entre l'heure actuelle et 9h30

t=datetime.now()-datetime.now().replace(hour=9,minute=30)
1
nidheesh

Dans Autres moyens d'obtenir la différence entre la date;

import dateutil.parser
import datetime
last_sent_date = "" # date string
timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)

Donc, obtenir une sortie en min.

Merci

0
Anurag Pandey

Ceci est mon approche en utilisant mktime .

from datetime import datetime, timedelta
from time import mktime

yesterday = datetime.now() - timedelta(days=1)
today = datetime.now()

difference_in_seconds = abs(mktime(yesterday.timetuple()) - mktime(today.timetuple()))
difference_in_minutes = difference_in_seconds / 60
0
Eduardo