Comprendre timedelta

90

Compte tenu du code python ci-dessous, aidez-moi à comprendre ce qui se passe là-bas.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Donc j'obtiens la différence entre start timeet end time, à la ligne 5 j'arrondis la durée par casting et quoi maintenant, quelle est l'explication supplémentaire?

Je sais ce que signifie delta (moyenne ou différence), mais pourquoi dois - je passer seconds = uptimeà timedeltaet pourquoi la coulée de chaîne fonctionne si bien que je reçois HH:MM:SS?

Paul
la source

Réponses:

114

Parce que timedelta est défini comme:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Tous les arguments sont facultatifs et par défaut à 0.

Vous pouvez facilement dire "Trois jours et quatre millisecondes" avec des arguments optionnels de cette façon.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

Et pour le cast de chaînes, il renvoie une belle valeur formatée au lieu d' __repr__améliorer la lisibilité. À partir de la documentation:

str (t) Renvoie une chaîne sous la forme [J jour [s],] [H] H: MM: SS [.UUUUUU], où D est négatif pour t négatif. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Documentation de paiement:

http://docs.python.org/library/datetime.html#timedelta-objects

utdemir
la source
13

pourquoi dois-je passer secondes = uptime à timedelta

Parce que les objets timedelta peuvent être passés en secondes, millisecondes, jours, etc ... vous devez donc spécifier ce que vous passez (c'est pourquoi vous utilisez la clé explicite). Le typage en intest superflu car ils pourraient également accepter des flotteurs.

et pourquoi le casting de cordes fonctionne-t-il si bien que j'obtiens HH: MM: SS?

Ce n'est pas le typage qui formate, c'est la __str__méthode interne de l'objet. En fait, vous obtiendrez le même résultat si vous écrivez:

print datetime.timedelta(seconds=int(uptime))
Mac
la source
1
Vous faites allusion à cela, mais il convient de noter explicitement que timedelta fait beaucoup plus que d'afficher des choses au format HH: MM: SS. Un objet timedelta est utilisé chaque fois que vous devez prendre une différence entre deux objets datetime.
Wilduck
1
Ce n'est pas la __repr__méthode, c'est la __str__méthode.
utdemir
1
Pas le __repr__()de timedelta, mais sa __str__()méthode. printvous appelle __str()__.
bgporter