242 votes

Comment calculer l'intervalle de temps entre deux chaînes de temps ?

J'ai deux heures, une heure de début et une heure de fin, au format 10:33:26 (HH:MM:SS). J'ai besoin de la différence entre les deux heures. J'ai consulté la documentation de Python et j'ai fait des recherches en ligne, et j'imagine que cela a quelque chose à voir avec les modules datetime et/ou time. Je n'arrive pas à le faire fonctionner correctement et je continue à trouver seulement comment faire cela quand une date est impliquée.

En fin de compte, je dois calculer les moyennes de plusieurs durées. J'ai réussi à faire fonctionner les différences de temps et je les stocke dans une liste. Je dois maintenant calculer la moyenne. J'utilise des expressions régulières pour analyser les durées initiales, puis les différences.

Pour le calcul de la moyenne, dois-je convertir en secondes puis calculer la moyenne ?

288voto

David Z Points 49476

Oui, sans aucun doute datetime est ce dont vous avez besoin ici. Plus précisément, le datetime.strptime() qui analyse une chaîne de caractères en un datetime objet.

from datetime import datetime
s1 = '10:33:26'
s2 = '11:15:49' # for example
FMT = '%H:%M:%S'
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)

Cela vous permet d'obtenir un timedelta qui contient la différence entre les deux temps. Vous pouvez en faire ce que vous voulez, par exemple la conversion en secondes ou en l'ajoutant à un autre datetime .

Le résultat sera négatif si l'heure de fin est antérieure à l'heure de début, par exemple s1 = 12:00:00 y s2 = 05:00:00 . Si vous souhaitez que le code suppose que l'intervalle dépasse minuit dans ce cas (c'est-à-dire qu'il doit supposer que l'heure de fin n'est jamais antérieure à l'heure de début), vous pouvez ajouter les lignes suivantes au code ci-dessus :

if tdelta.days < 0:
    tdelta = timedelta(
        days=0,
        seconds=tdelta.seconds,
        microseconds=tdelta.microseconds
    )

(bien entendu, vous devez inclure from datetime import timedelta quelque part). Merci à J.F. Sebastian d'avoir signalé ce cas d'utilisation.

213voto

Bill Grava Points 91

Essayez ceci -- c'est efficace pour chronométrer les événements à court terme. Si un événement prend plus d'une heure, l'affichage final nécessitera probablement un formatage convivial.

import time
start = time.time()

time.sleep(10)  # or do something more productive

done = time.time()
elapsed = done - start
print(elapsed)

La différence de temps est renvoyée sous forme de nombre de secondes écoulées.

21voto

J.F. Sebastian Points 102961

Voici une solution qui permet de trouver la différence même si l'heure de fin est inférieure à l'heure de début (sur un intervalle de minuit), par exemple 23:55:00-00:25:00 (d'une durée d'une demi-heure) :

#!/usr/bin/env python
from datetime import datetime, time as datetime_time, timedelta

def time_diff(start, end):
    if isinstance(start, datetime_time): # convert to datetime
        assert isinstance(end, datetime_time)
        start, end = [datetime.combine(datetime.min, t) for t in [start, end]]
    if start <= end: # e.g., 10:33:26-11:15:49
        return end - start
    else: # end < start e.g., 23:55:00-00:25:00
        end += timedelta(1) # +day
        assert end > start
        return end - start

for time_range in ['10:33:26-11:15:49', '23:55:00-00:25:00']:
    s, e = [datetime.strptime(t, '%H:%M:%S') for t in time_range.split('-')]
    print(time_diff(s, e))
    assert time_diff(s, e) == time_diff(s.time(), e.time())

Output

0:42:23
0:30:00

time_diff() renvoie un objet timedelta que vous pouvez passer (en tant qu'élément de la séquence) à un objet mean() directement, par exemple :

#!/usr/bin/env python
from datetime import timedelta

def mean(data, start=timedelta(0)):
    """Find arithmetic average."""
    return sum(data, start) / len(data)

data = [timedelta(minutes=42, seconds=23), # 0:42:23
        timedelta(minutes=30)] # 0:30:00
print(repr(mean(data)))
# -> datetime.timedelta(0, 2171, 500000) # days, seconds, microseconds

En mean() Le résultat est également timedelta() que vous pouvez convertir en secondes ( td.total_seconds() (depuis Python 2.7)), les heures ( td / timedelta(hours=1) (Python 3)), etc.

15voto

Kyra Points 2922

Le présent dit d'essayer :

import datetime as dt
start="09:35:23"
end="10:23:00"
start_dt = dt.datetime.strptime(start, '%H:%M:%S')
end_dt = dt.datetime.strptime(end, '%H:%M:%S')
diff = (end_dt - start_dt) 
diff.seconds/60 

Ce forum utilise time.mktime()

14voto

Lukasz Dziedzia Points 4134

La structure qui représente le décalage horaire en Python est appelée timedelta . Si vous avez start_time y end_time comme datetime vous pouvez calculer la différence en utilisant - opérateur comme :

diff = end_time - start_time

vous devez le faire avant de convertir en un format de chaîne particulier (par exemple, avant start_time.strftime(...)). Si vous avez déjà une représentation sous forme de chaîne de caractères, vous devez la reconvertir en temps/date en utilisant strptime méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X