Saya mengalami kesulitan memformat datetime.timedelta
objek.
Inilah yang saya coba lakukan: Saya memiliki daftar objek dan salah satu anggota kelas objek adalah objek timedelta yang menunjukkan durasi suatu peristiwa. Saya ingin menampilkan durasi itu dalam format jam: menit.
Saya telah mencoba berbagai metode untuk melakukan ini dan saya mengalami kesulitan. Pendekatan saya saat ini adalah menambahkan metode ke kelas untuk objek saya yang menghasilkan jam dan menit. Saya bisa mendapatkan jam dengan membagi timedelta.seconds dengan 3600 dan membulatkannya. Saya mengalami masalah dengan mendapatkan sisa detik dan mengubahnya menjadi menit.
Omong-omong, saya menggunakan Google AppEngine dengan Django Templates untuk presentasi.
datetime.utcfromtimestamp()
. Lihat jawaban saya di bawah ini.__str__
daritimedelta
cukup layak, sebagai lawan__repr__
(yaitu - untuk manusia!). Misalnya:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48
memberidatetime.timedelta(seconds=21871, microseconds=208333)
, tetapistr(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)
memberi'6:04:31.208333'
yang cukup OK untuk dibaca.Jawaban:
Anda bisa mengonversi timedelta menjadi string dengan str (). Ini sebuah contoh:
sumber
print 'some thing ' + str(delta)
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
maka Anda hanya menggunakan split untuk mengeluarkan mikrodetik dari permainan. Dari 0: 03: 43.765000 saya bisa mendapatkan 0:03:43 hanya dengan menjalankanTotalDuration=str(ConvertDuration).split('.', 2)[0]
Seperti yang Anda ketahui, Anda bisa mendapatkan total_seconds dari objek timedelta dengan mengakses
.seconds
atribut.Python menyediakan fungsi bawaan
divmod()
yang memungkinkan untuk:atau Anda dapat mengonversi menjadi berjam-jam dan sisanya dengan menggunakan kombinasi modulo dan pengurangan:
sumber
abs(s)
.'%d:%02d:%02d'
untuk memiliki nol di dalam string keluaran..seconds
jika perbedaannya bisa negatif atau lebih dari 24 jam (.seconds
atribut diabaikan.days
). Gunakan.total_seconds()
atau analognya saja.Melewati
timedelta
objek kestr()
fungsi memanggil kode pemformatan yang sama yang digunakan jika kita cukup mengetikprint td
. Karena Anda tidak menginginkan detik, kami dapat memisahkan string dengan titik dua (3 bagian) dan memasangnya kembali hanya dengan 2 bagian pertama.sumber
str(my_timedelta)
bekerja buruk untuk angka negatifsumber
if seconds > period_seconds:
untuk berubahif seconds >= period_seconds:
.Saya pribadi menggunakan
humanize
perpustakaan untuk ini:Tentu saja, itu tidak memberi Anda jawaban tepat yang Anda cari (yang memang
str(timeA - timeB)
, tapi saya telah menemukan bahwa setelah Anda melampaui beberapa jam, tampilan menjadi cepat tidak dapat dibaca.humanize
Memiliki dukungan untuk nilai yang jauh lebih besar yang dapat dibaca oleh manusia, dan juga terlokalisasi dengan baik.Ini terinspirasi oleh
contrib.humanize
modul Django , rupanya, jadi karena Anda menggunakan Django, Anda mungkin harus menggunakannya.sumber
naturaltime
adalah apa yang ingin Anda gunakan.Dia sudah memiliki objek timedelta jadi mengapa tidak menggunakan metode built-in total_seconds () untuk mengubahnya menjadi detik, lalu gunakan divmod () untuk mendapatkan jam dan menit?
Ini berfungsi terlepas dari apakah waktu delta bahkan berhari-hari atau bertahun-tahun.
sumber
Berikut adalah fungsi tujuan umum untuk mengonversi
timedelta
objek atau angka biasa (dalam bentuk detik atau menit, dll.) Ke string yang diformat dengan baik. Saya mengambil jawaban mpounsett yang luar biasa pada pertanyaan duplikat, membuatnya sedikit lebih fleksibel, meningkatkan daya tampung, dan menambahkan dokumentasi.Anda akan menemukan bahwa itu adalah jawaban yang paling fleksibel di sini sejauh ini karena memungkinkan Anda untuk:
Fungsi:
Demo:
sumber
Saya tahu ini adalah pertanyaan lama, tapi saya gunakan
datetime.utcfromtimestamp()
untuk ini. Dibutuhkan jumlah detik dan mengembalikandatetime
yang dapat diformat seperti yang laindatetime
.Selama Anda tetap berada dalam rentang hukum untuk bagian waktu ini akan berfungsi, yaitu tidak mengembalikan 1234: 35 karena jam adalah <= 23.
sumber
print timedelta(seconds=end - begin)
..zfill(8)
jika Anda membutuhkannya.Penanya menginginkan format yang lebih bagus daripada biasanya:
Jadi, sungguh ada dua format, satu di mana hari adalah 0 dan itu ditinggalkan, dan yang lain di mana ada teks "n hari, h: m: s". Tetapi, detik-detik mungkin memiliki pecahan, dan tidak ada angka nol di depan dalam cetakan, sehingga kolom menjadi berantakan.
Inilah rutinitas saya, jika Anda suka:
ini mengembalikan output sebagai format dd: hh: mm: ss:
Saya memang berpikir untuk menambahkan tahun ke ini, tetapi ini dibiarkan sebagai latihan untuk pembaca, karena hasilnya aman di lebih dari 1 tahun:
sumber
Saya serius mempertimbangkan pendekatan Occam's Razor di sini:
Ini mengembalikan string tanpa mikrodetik
Jika Anda ingin membuat ulang objek datetime.timedelta, lakukan ini:
2 tahun, saya suka bahasa ini!
sumber
datetime.timedelta
Benda-benda saya menjadi lebih besar dari satu hari. Jadi inilah masalah selanjutnya. Semua diskusi di atas mengasumsikan kurang dari sehari. Atimedelta
sebenarnya adalah tuple hari, detik dan mikrodetik. Diskusi di atas harus digunakantd.seconds
seperti yang dilakukan joe, tetapi jika Anda punya hari, itu TIDAK termasuk dalam nilai detik.Saya mendapatkan rentang waktu antara 2 datetimes dan mencetak hari dan jam.
sumber
Saya menggunakan
humanfriendly
pustaka python untuk melakukan ini, ia bekerja dengan sangat baik.Tersedia di https://pypi.org/project/humanfriendly/
sumber
Mengikuti nilai contoh Joe di atas, saya akan menggunakan operator modulus aritmatika, dengan demikian:
Perhatikan bahwa pembagian integer dalam Python dibulatkan secara default; jika Anda ingin lebih eksplisit, gunakan math.floor () atau math.ceil () yang sesuai.
sumber
td.total_seconds()
daripada.seconds
membuatnya bekerja untuk interval> 1 hari.sumber
timedelta
objek memiliki bidangdays
,seconds
danmicroseconds
oleh dokumentasi.Saya memiliki masalah yang sama dengan hasil perhitungan lembur di tempat kerja. Nilai harus selalu muncul di HH: MM, bahkan ketika itu lebih besar dari satu hari dan nilainya bisa menjadi negatif. Saya menggabungkan beberapa solusi yang ditunjukkan dan mungkin orang lain menganggap solusi ini bermanfaat. Saya menyadari bahwa jika nilai timedelta negatif, sebagian besar solusi yang ditunjukkan dengan metode divmod tidak bekerja di luar kotak:
timedelta ke HH: MM string:
sumber
sumber
Filter template lurus ke depan untuk masalah ini. Fungsi built-in int () tidak pernah ditangkap. F-Strings (yaitu f '') membutuhkan python 3.6.
sumber
Ini akan menghasilkan:
sumber
Silakan periksa fungsi ini - ia mengubah objek timedelta menjadi string 'HH: MM: SS'
sumber
Satu liner Karena timedeltas tidak menawarkan strimeime datetime, bawa timedelta kembali ke datetime, dan gunakan stftime.
Ini tidak hanya dapat mencapai format OP yang diminta Jam: Menit, sekarang Anda dapat memanfaatkan kekuatan format penuh dari waktu kerja datetime, jika persyaratan Anda berubah ke representasi lain.
Ini juga memecahkan gangguan yang timedeltas diformat menjadi string sebagai H: MM: SS daripada HH: MM: SS, yang membawa saya ke masalah ini, dan solusi yang saya bagikan.
sumber
Jika Anda sudah memiliki obj timedelta maka cukup konversikan obj tersebut menjadi string. Hapus 3 karakter terakhir dari string dan cetak. Ini akan memotong bagian detik dan mencetak sisanya dalam format Jam: Menit.
sumber
print t.split('.')[0]
Jika Anda kebetulan ada
IPython
dalam paket Anda (Anda harus), itu memiliki (hingga sekarang, bagaimanapun) formatter yang sangat bagus untuk durasi (dalam float detik). Itu digunakan di berbagai tempat, misalnya dengan%%time
sihir sel. Saya suka format yang dihasilkan untuk durasi pendek:sumber
Sehingga untuk:
pengembalian:
sumber
Terima kasih semuanya atas bantuan Anda. Saya mengambil banyak ide Anda dan menggabungkannya, biarkan saya tahu apa yang Anda pikirkan.
Saya menambahkan dua metode ke kelas seperti ini:
Dalam Django saya, saya menggunakan ini (jumlah adalah objek dan itu dalam kamus):
sumber