I have a datetime object produced using
strptime ().
>>> tm
datetime.datetime(2010, 6, 10, 3, 56, 23)
Yang perlu saya lakukan adalah membulatkan menit ke menit ke-10 terdekat. Apa yang telah saya lakukan hingga saat ini adalah mengambil nilai menit dan menggunakan round () di atasnya.
min = round(tm.minute, -1)
Namun, seperti contoh di atas, memberikan waktu tidak valid ketika nilai menit lebih besar dari 56. yaitu: 3:60
Apa cara yang lebih baik untuk melakukan ini? Apakah datetime
mendukung ini?
dt.replace(hour=0, minute=0, second=0)
bukandt.min
.roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60*24*7)
vsroundTime(datetime.datetime(2012,12,30,23,44,59,1234),roundTo=60*60*24*7)
datetime.timedelta(100,1,2,3).seconds == 1
Dari jawaban terbaik yang saya modifikasi ke versi yang diadaptasi hanya menggunakan objek datetime, ini menghindari keharusan melakukan konversi ke detik dan membuat kode panggilan lebih mudah dibaca:
Sampel dengan pembulatan 1 jam & pembulatan 15 menit:
sumber
print roundTime(datetime.datetime(2012,12,20,23,44,49),datetime.timedelta(days=15))
2012-12-20 00:00:00
sementaraprint roundTime(datetime.datetime(2012,12,21,23,44,49),datetime.timedelta(days=15))
2012-12-21 00:00:00
Saya menggunakan kode Stijn Nevens (terima kasih Stijn) dan memiliki sedikit add-on untuk dibagikan. Pembulatan ke atas, bawah, dan pembulatan ke terdekat.
perbarui 2019-03-09 = komentar Spinxz dimasukkan; Terima kasih.
perbarui 2019-12-27 = komentar Bart dimasukkan; Terima kasih.
Diuji untuk date_delta dari "X jam" atau "X menit" atau "X detik".
sumber
up
pembulatan bagaimanapun akurat dengan fungsi ini;2019-11-07 14:39:00.776980
dengandate_delta
sama dengan misalnya 30 detik danto='up'
hasilnya2019-11-07 14:39:00
.up
pembulatan mungkin bukan kasus penggunaan umum, pembulatan ini diperlukan saat Anda menangani aplikasi yang dimulai pada batas menitPandas memiliki fitur putaran waktu, tetapi seperti kebanyakan hal di Pandas, fitur ini harus dalam format Seri.
Docs - Ubah string frekuensi sesuai kebutuhan.
sumber
Timestamp
berisifloor
danceil
jugaJika Anda tidak ingin menggunakan kondisi, Anda dapat menggunakan
modulo
operator:MEMPERBARUI
apakah kamu menginginkan sesuatu seperti ini?
.. Jika Anda ingin hasil sebagai string. untuk mendapatkan hasil datetime, lebih baik menggunakan timedelta - lihat tanggapan lain;)
sumber
saya menggunakan ini. itu memiliki keuntungan bekerja dengan datetimes yang sadar tz.
Ini memiliki kelemahan hanya bekerja untuk penjepit waktu kurang dari satu jam.
sumber
Berikut adalah solusi umum yang lebih sederhana tanpa masalah presisi floating point dan dependensi library eksternal:
Dalam kasus Anda:
sumber
sumber
Berdasarkan Stijn Nevens dan dimodifikasi untuk penggunaan Django untuk membulatkan waktu saat ini ke 15 menit terdekat.
jika Anda membutuhkan tanggal dan waktu penuh, hapus saja
.strftime('%H:%M:%S')
sumber
Bukan yang terbaik untuk kecepatan saat pengecualian ditangkap, namun ini akan berhasil.
Pengaturan waktu
sumber
Solusi intuitif dua baris untuk membulatkan ke satuan waktu tertentu, di sini detik, untuk suatu
datetime
objekt
:Jika Anda ingin membulatkan ke unit lain, cukup ubah
format_str
.Pendekatan ini tidak membulatkan ke jumlah waktu sewenang-wenang seperti metode di atas, tetapi merupakan cara Pythonic yang bagus untuk membulatkan ke jam, menit atau detik tertentu.
sumber
Solusi lain:
Semoga ini membantu!
sumber
Cara terpendek yang saya tahu
sumber
Itu tampak terlalu rumit
sumber
Pendekatan langsung:
sumber
ya, jika data Anda termasuk dalam kolom DateTime dalam seri pandas, Anda bisa membulatkannya menggunakan fungsi pandas.Series.dt.round bawaan. Lihat dokumentasi di sini di pandas.Series.dt.round . Dalam kasus Anda pembulatan ke 10 menit itu akan menjadi Series.dt.round ('10min') atau Series.dt.round ('600s') seperti ini:
Edit untuk menambahkan kode Contoh:
sumber