Zrozumienie timedelta

90

Biorąc pod uwagę poniższy kod Pythona, pomóż mi zrozumieć, co się tam dzieje.

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

uptime = end_time - start_time

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

Więc dostaję różnicę między start timea end time, w linii 5 zaokrąglam czas trwania przez rzucanie i co teraz, jakie jest dalsze wyjaśnienie?

Wiem, co oznacza delta (średnia lub różnica), ale dlaczego muszę przejść seconds = uptimedo timedeltai dlaczego rzucanie struny działa tak dobrze, że otrzymuję HH:MM:SS?

Paweł
źródło

Odpowiedzi:

115

Ponieważ timedelta definiuje się następująco:

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

Wszystkie argumenty są opcjonalne i domyślnie mają wartość 0.

Możesz łatwo powiedzieć „Trzy dni i cztery milisekundy” z opcjonalnymi argumentami w ten sposób.

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

W przypadku rzutowania str zwraca ładną sformatowaną wartość zamiast __repr__poprawić czytelność. Z dokumentów:

str (t) Zwraca ciąg w postaci [D dzień [dni],] [H] H: MM: SS [.UUUUUU], gdzie D jest ujemne dla ujemnego t. (5)

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

Dokumentacja do kasy:

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

utdemir
źródło
13

dlaczego muszę przechodzić sekundy = uptime do timedelta

Ponieważ obiektom timedelta można przekazywać sekundy, milisekundy, dni itp ... więc musisz określić, co przekazujesz (dlatego używasz jawnego klucza). Rzutowanie na typ intjest zbędne, ponieważ mogą również akceptować spławiki.

i dlaczego odlewanie struny działa tak dobrze, że otrzymuję HH: MM: SS?

Formatowanie nie jest typowe, jest wewnętrzną __str__metodą obiektu. W rzeczywistości osiągniesz ten sam wynik, jeśli napiszesz:

print datetime.timedelta(seconds=int(uptime))
prochowiec
źródło
1
Sugerujesz, ale warto wyraźnie zauważyć, że timedelta robi o wiele więcej niż wyświetlanie rzeczy w formacie HH: MM: SS. Obiekt timedelta jest używany zawsze, gdy trzeba wziąć różnicę między dwoma obiektami daty i godziny.
Wilduck
1
To nie jest __repr__metoda, to jest __str__metoda.
utdemir
1
Nie __repr__()timedelta, ale jej __str__()metoda. printwoła __str()__do ciebie.
bgporter