web-dev-qa-db-fra.com

Différence de date en minutes en Python

Comment calculer la différence de temps en minutes pour l'horodatage suivant en Python?

2010-01-01 17:31:22
2010-01-03 17:31:22
47
Hulk

La réponse de RSabet ne fonctionne pas dans les cas où les dates n'ont pas la même heure exacte.

Problème d'origine:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)

daysDiff = (d2-d1).days
print daysDiff
> 2

# Convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
> 2880

d2-D1 vous donne un datetime.timedelta et lorsque vous utilisez jours, il ne vous montrera que les jours dans le timedelta. Dans ce cas, cela fonctionne bien, mais si vous aviez ce qui suit.

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

daysDiff = (d2-d1).days
print daysDiff
> 2

# Convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
> 2880  # that is wrong

Il vous aurait quand même donné la même réponse puisqu'il retourne toujours 2 pendant des jours; il ignore l'heure, minute et seconde de la timedelta.

Une meilleure approche consisterait à convertir les dates en un format commun, puis à effectuer le calcul. Le moyen le plus simple de le faire est de les convertir en horodatages Unix. Voici le code pour le faire.

from datetime import datetime
import time

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

# Convert to Unix timestamp
d1_ts = time.mktime(d1.timetuple())
d2_ts = time.mktime(d2.timetuple())

# They are now in seconds, subtract and then divide by 60 to get minutes.
print int(d2_ts-d1_ts) / 60
> 3043  # Much better
80
Ken Cochrane
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
53
Evalds Urtans

Au cas où quelqu'un ne s'en rendrait pas compte, on pourrait combiner les réponses de Christophe et RSabet:

from datetime import datetime
import time

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

diff = d2 -d1
diff_minutes = (diff.days * 24 * 60) + (diff.seconds/60)

print(diff_minutes)
> 3043
16
Jon F.

Utilisez datetime.strptime() pour analyser des instances datetime, puis calculez la différence et enfin convertir la différence en minutes.

6
unwind

Le résultat dépend du fuseau horaire qui correspond aux chaînes de temps saisies. 

Le cas le plus simple si les deux dates utilisent le même décalage utc:

#!/usr/bin/env python3
from datetime import datetime, timedelta

time_format = "%Y-%d-%m %H:%M:%S"
dt1 = datetime.strptime("2010-01-01 17:31:22", time_format)
dt2 = datetime.strptime("2010-01-03 17:31:22", time_format)
print((dt2 - dt1) // timedelta(minutes=1)) # minutes

Si votre version de Python ne supporte pas td // timedelta; remplacez-le par int(td.total_seconds() // 60).

Si l'heure de saisie est dans le fuseau horaire local et que le décalage utc peut être différent à différentes heures, par exemple, il a l'heure d'été; vous devez donc insérer dt1, dt2 dans les objets de date et heure conscient avant de trouver la différence utc offset.

La méthode portable pour créer des objets date/heure locaux conscients consiste à utiliser les fuseaux horaires pytz:

#!/usr/bin/env python
from datetime import timedelta
import tzlocal # $ pip install tzlocal

local_tz = tzlocal.get_localzone() # get pytz timezone
aware_dt1, aware_dt2 = map(local_tz.localize, [dt1, dt2])
td  = aware_dt2 - aware_dt1 # elapsed time

Si dt1 ou dt2 correspond à une heure ambiguë, le is_dst=False par défaut est utilisé pour lever la ambiguïté. Vous pouvez définir is_dst=None pour qu'il déclenche une exception pour des heures locales ambiguës ou non existantes.

Si vous ne pouvez pas installer de modules tiers, vous pouvez utiliser time.mktime() à partir de la réponse de @Ken Cochrane qui peut trouver le décalage utc correct sur certaines plates-formes à certaines dates et dans certains fuseaux horaires - mais peut-être faux), il vaut donc mieux que de faire dt2 - dt1 avec des objets date-heure naïfs qui échouent toujours si les décalages utc correspondants sont différents.

2
jfs

Pour calculer avec une date différente, procédez comme suit:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

diff = d2-d1
diff_minutes = diff.seconds/60
2
Christophe

Comme on l'a déjà dit, vous devez utiliser la méthode datetime.datetime'sstrptime:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)

daysDiff = (d2-d1).days

# convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
0
Gezim

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

import dateutil.parser
import datetime

timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)

Merci

0
Anurag Pandey