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
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
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
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
Utilisez datetime.strptime()
pour analyser des instances datetime, puis calculez la différence et enfin convertir la différence en minutes.
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.
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
Comme on l'a déjà dit, vous devez utiliser la méthode datetime.datetime's
strptime
:
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
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