2010-01-22 4 views
124

J'ai un timedelta. Je veux les jours, les heures et les minutes de cela - soit comme un uplet ou un dictionnaire ... Je ne suis pas dérangé. J'ai dû faire cela une douzaine de fois dans une douzaine de langues au cours des années mais Python a généralement une réponse simple à tout, alors j'ai pensé que je demanderais ici avant de bousculer des mathématiques nauséabondes (mais verbeuses).Convertir un timedelta en jours, heures et minutes

M. Fooz soulève un bon point.

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

Ai-je raison de dire que ne pas tenir compte de DST? Si non, quel est le moyen le plus simple d'ajouter/soustraire une heure?

Répondre

176

Si vous avez une valeur datetime.timedeltatd, td.days vous donne déjà les « jours » que vous voulez. timedelta valeurs garder en secondes (pas directement heures ou minutes) fraction de journée de sorte que vous aurez en effet à effectuer des « mathématiques simples nauséabonde », par exemple:

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

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

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

En ce qui concerne l'heure d'été, je pense que la meilleure chose est de convertir les deux datetime objets en secondes. De cette façon, le système calcule DST 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

'mktime()' peut échouer si le fuseau horaire local peut avoir un utc décalage différent à différents moments (beaucoup le font) - vous pouvez utiliser 'module pytz' pour accéder à la base de données de tz dans un deteministic portable façon. En outre, 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] (http://stackoverflow.com/a/26221183/4279). Voir [Comment puis-je soustraire un jour d'une date python?] (Http://stackoverflow.com/q/441147/4279) qui peut avoir à faire face à des problèmes similaires. – jfs

4

Je ne comprends pas

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

que diriez-vous

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

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

53

Ceci est un peu plus compact, vous obtenez les heures, minutes et secondes en deux lignes.

days = td.days 
hours, remainder = divmod(td.seconds, 3600) 
minutes, seconds = divmod(remainder, 60) 
# If you want to take into account fractions of a second 
seconds += td.microseconds/1e6 
+5

c'est incorrect si 'td.days' est différent de zéro. Vous avez besoin de 'hours + = td.days * 24'. Si vous voulez prendre en compte des fractions de seconde (OP ne le fait pas); 'secondes + = td.microseconds/1e6' pourrait être utilisé. – jfs

Questions connexes