Timedelta verstehen

90

Bitte helfen Sie mir angesichts des folgenden Python-Codes zu verstehen, was dort passiert.

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

uptime = end_time - start_time

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

Also bekomme ich den Unterschied zwischen start timeund end timein Zeile 5 runde ich die Dauer durch Casting auf und was nun, was ist die weitere Erklärung?

Ich weiß , was Delta Mittel (Durchschnitt oder Differenz), aber warum muss ich weitergeben seconds = uptimezu timedeltaund warum ist der String Casting funktioniert so gut , dass ich bekommen HH:MM:SS?

Paul
quelle

Antworten:

114

Weil timedelta wie folgt definiert ist:

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

Alle Argumente sind optional und standardmäßig 0.

Auf diese Weise können Sie mit optionalen Argumenten leicht "Drei Tage und vier Millisekunden" sagen.

>>> 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)

Und für das Str-Casting wird ein schöner formatierter Wert zurückgegeben, anstatt __repr__die Lesbarkeit zu verbessern. Aus Dokumenten:

str (t) Gibt einen String in der Form [D Tag [s],] [H] H: MM: SS [.UUUUUU] zurück, wobei D für negatives t negativ ist. (5)

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

Checkout-Dokumentation:

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

utdemir
quelle
13

Warum muss ich Sekunden = Betriebszeit an timedelta übergeben?

Da Zeitdelta-Objekte Sekunden, Millisekunden, Tage usw. übergeben werden können, müssen Sie angeben, was Sie übergeben (aus diesem Grund verwenden Sie den expliziten Schlüssel). Typecasting to intist überflüssig, da sie auch Floats akzeptieren können.

und warum funktioniert das String Casting so gut, dass ich HH: MM: SS bekomme?

Es ist nicht die Typumwandlung, die formatiert wird, sondern die interne __str__Methode des Objekts. In der Tat werden Sie das gleiche Ergebnis erzielen, wenn Sie schreiben:

print datetime.timedelta(seconds=int(uptime))
Mac
quelle
1
Sie weisen darauf hin, aber es ist ausdrücklich darauf hinzuweisen, dass timedelta viel mehr kann, als Dinge im HH: MM: SS-Format anzuzeigen. Ein Zeitdelta-Objekt wird immer dann verwendet, wenn Sie einen Unterschied zwischen zwei Datums- / Uhrzeitobjekten vornehmen müssen.
Wilduck
1
Es ist nicht die __repr__Methode, es ist die __str__Methode.
utdemir
1
Nicht das __repr__()von Timedelta, sondern seine __str__()Methode. printruft __str()__nach dir.
Bgporter