314 votes

Convertir un timedelta en jours, heures et minutes

J'ai un timedelta. Je veux les jours, les heures et les minutes qui en découlent - soit sous forme de tuple, soit sous forme de dictionnaire... Ça ne me dérange pas.

J'ai dû faire cela une douzaine de fois dans une douzaine de langages au fil des ans, mais Python a généralement une réponse simple à tout, alors j'ai pensé que je devais poser la question ici avant de me lancer dans des mathématiques d'une simplicité écœurante (et pourtant verbeuses).

M. Fooz soulève un bon point.

J'ai affaire à des "listes" (un peu comme les listes ebay) où chacune a une durée. J'essaie de trouver le temps restant en faisant when_added + duration - now

Ai-je raison de dire que cela ne tient pas compte de l'heure d'été ? Sinon, quel est le moyen le plus simple d'ajouter/soustraire une heure ?

4 votes

Si c'est juste pour l'avoir en tant que chaîne de caractères au format HH:mm:ss, par exemple "0:19:37" de la timedelta objet "datetime.timedelta(seconds=1177)" : simplement utiliser str()

439voto

Alex Martelli Points 330805

Si vous avez un datetime.timedelta valeur td , td.days vous donne déjà les "jours" que vous voulez. timedelta conservent la fraction de jour en secondes (et non directement en heures ou en minutes). Vous devrez donc effectivement effectuer des "mathématiques simples et nauséabondes", par exemple :

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

2 votes

Gardez à l'esprit que si td est négatif, -1 // 3600 es -1 .

9 votes

Pourquoi // ? au lieu de /

19 votes

// est utilisé à la place de / pour obtenir un entier, pas un flottant. // est un opérateur de division d'étage : "division qui aboutit à un nombre entier ajusté à gauche sur la ligne des nombres", voir aquí .

90voto

martinbc Points 630

C'est un peu plus compact, vous obtenez les heures, les minutes et les secondes sur deux lignes.

hours, remainder = divmod(td.seconds, 3600)

minutes, seconds = divmod(remainder, 60)

0 votes

Astuce @martineau : regardez les dates de mon commentaire et l'historique des modifications de la réponse.

0 votes

@jfs : Si votre commentaire est obsolète (c'est-à-dire qu'il n'est plus nécessaire), vous devriez le supprimer parce qu'aujourd'hui, il est source de confusion pour les personnes qui ne veulent pas passer/perdre leur temps à comparer soigneusement les horodatages de commande et d'édition historu.

0 votes

@martineau Je ne surveille pas les modifications apportées aux réponses pour lesquelles j'ai laissé des commentaires. Si vous pensez que le commentaire est obsolète, signalez-le. Peut-être devriez-vous demander à la personne qui a effectué l'édition qui rend les commentaires obsolètes, afin qu'elle puisse notifier/marquer les commentaires.

34voto

Jason Orendorff Points 15869
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Pour ce qui est de l'heure d'été, je pense que la meilleure chose à faire est de convertir les deux datetime en secondes. De cette façon, le système calcule l'heure d'été pour vous.

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1 votes

mktime() peut échouer si le fuseau horaire local peut avoir un décalage utc différent à différents moments (c'est souvent le cas) -- vous pourriez utiliser pytz pour accéder à la base de données tz d'une manière portable et déteministe. De plus, l'heure locale peut être ambiguë (50% de chances d'erreur) -- vous avez besoin d'informations supplémentaires pour désambiguïser, par exemple, souvent (pas toujours) les dates dans un fichier journal sont monotones . Voir Comment soustraire un jour d'une date en python ? qui pourraient avoir à faire face à des problèmes similaires.

9voto

campbell Points 16

Je ne comprends pas.

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

que pensez-vous de ceci

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

Vous obtenez les minutes et les secondes d'une minute comme un flotteur.

-5voto

Jochen Ritzel Points 42916

Les timedeltas ont un days et seconds vous pouvez les convertir vous-même avec facilité.

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