Saya sedang menulis fungsi yang membutuhkan masukan timedelta untuk diteruskan sebagai string. Pengguna harus memasukkan sesuatu seperti "32m" atau "2h32m", atau bahkan "4:13" atau "5hr34m56s" ... Apakah ada perpustakaan atau sesuatu yang sudah menerapkan hal semacam ini?
96
d
hari,h
jam,m
menit dans
detik menggunakan satu baris (setelah mengimpordatetime
):datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)
.Jawaban:
Untuk format pertama (5 jam34m56d), Anda harus mengurai menggunakan ekspresi reguler
Berikut adalah solusi berbasis ulang:
sumber
dateutil.parser.parse
tidak akan menguraitimedelta
objek. Ini mengembalikan adatetime
, dan itu akan memicu pengecualian untuk string seperti'28:32:11.10'
.Bagi saya, solusi paling elegan, tanpa harus menggunakan pustaka eksternal seperti dateutil atau mengurai input secara manual, adalah dengan menggunakan metode parsing string yang kuat dari datetime
strptime
.Setelah ini, Anda dapat menggunakan objek timedelta seperti biasa, mengubahnya menjadi detik untuk memastikan kami melakukan hal yang benar, dll.
sumber
datetime.strptime("32:20:25","%H:%M:%S")
tidak berfungsi), dan Anda harus mengetahui format input yang tepat.timedelta
parameter cukup menjengkelkan, tetapi yang terbaik yang bisa saya lakukan untuk menghindari ini adalah:,delta = t - datetime.combine(t.date(), time.min)
yang ... mengerikan.Aku punya sedikit waktu di tangan saya kemarin, jadi saya mengembangkan @virhilo 's jawaban ke dalam modul Python, menambahkan beberapa format ekspresi lebih banyak waktu, termasuk semua yang diminta oleh @priestc .
Kode sumber ada di github (Lisensi MIT) untuk siapa saja yang menginginkannya. Ini juga ada di PyPI:
Mengembalikan waktu sebagai jumlah detik:
sumber
Saya ingin memasukkan hanya satu waktu dan kemudian menambahkannya ke berbagai tanggal jadi ini berhasil untuk saya:
sumber
dtt.strptime(myduration, "%H:%M:%S") - dtt(1900, 1, 1)
juga bekerja ...Saya telah mengubah jawaban bagus virhilo dengan beberapa peningkatan:
3m0.25s
3 menit, 0,25 detik).
sumber
Django hadir dengan fungsi utilitas
parse_duration()
. Dari dokumentasi :sumber
parse_duration()
fungsi Django menggunakan pencocokan regex di bawah tenda.Jika Anda menggunakan Python 3 maka inilah versi terbaru untuk solusi Hari Shankar, yang saya gunakan:
sumber
Gunakan pustaka isodate untuk mengurai string durasi ISO 8601. Sebagai contoh:
Lihat juga Apakah ada cara mudah untuk mengonversi durasi ISO 8601 ke timedelta?
sumber