Memahami timedelta

90

Diberikan kode python di bawah ini, tolong bantu saya memahami apa yang terjadi di sana.

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

uptime = end_time - start_time

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

Jadi saya mendapatkan perbedaan antara start timedan end time, di baris 5 saya membulatkan durasi dengan casting dan apa sekarang, apa penjelasan selanjutnya?

Aku tahu apa artinya delta (rata-rata atau perbedaan), tapi kenapa aku harus melewati seconds = uptimeuntuk timedeltadan mengapa casting string yang bekerja begitu baik bahwa saya mendapatkan HH:MM:SS?

Paul
sumber

Jawaban:

115

Karena timedelta diartikan seperti:

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

Semua argumen bersifat opsional dan default ke 0.

Anda dapat dengan mudah mengatakan "Tiga hari empat milidetik" dengan argumen opsional seperti itu.

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

Dan untuk pengecoran str, mengembalikan nilai yang diformat bagus daripada __repr__untuk meningkatkan keterbacaan. Dari dokumen:

str (t) Mengembalikan string dalam bentuk [D hari [s],] [H] H: MM: SS [.UUUUUU], di mana D negatif untuk t negatif. (5)

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

Dokumentasi Checkout:

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

utdemir
sumber
13

mengapa saya harus melewatkan detik = uptime ke timedelta

Karena objek timedelta dapat dilalui detik, milidetik, hari, dll ... jadi Anda perlu menentukan apa yang Anda teruskan (inilah mengapa Anda menggunakan kunci eksplisit). Typecasting to inttidak berguna karena mereka juga bisa menerima float.

dan mengapa casting string bekerja dengan sangat baik sehingga saya mendapatkan HH: MM: SS?

Bukan typecasting yang memformat, ini adalah __str__metode internal objek. Bahkan Anda akan mencapai hasil yang sama jika Anda menulis:

print datetime.timedelta(seconds=int(uptime))
Mac
sumber
1
Anda mengisyaratkan hal ini, tetapi Perlu dicatat secara eksplisit bahwa timedelta melakukan lebih dari sekadar menampilkan sesuatu dalam format HH: MM: SS. Objek timedelta digunakan setiap kali Anda perlu mengambil perbedaan antara dua objek datetime.
Wilduck
1
Ini bukanlah __repr__metode, ini adalah __str__metode.
utdemir
1
Bukan __repr__()dari timedelta, tapi __str__()metodenya. printpanggilan __str()__untukmu.
bgporter