Apa perbedaan antara datetime.timedelta
(dari pustaka standar Python) dan dateutil.relativedelta.relativedelta
saat bekerja hanya dengan hari?
Sejauh yang saya mengerti, timedelta
hanya mendukung hari (dan minggu), sambil relativedelta
menambahkan dukungan untuk periode yang ditentukan dalam hal tahun, bulan, minggu atau hari, serta menentukan nilai absolut untuk tahun, bulan atau hari. (ingat, untuk keperluan pertanyaan ini, saya tidak perlu khawatir tentang jam, menit, atau detik)
Mengingat saya hanya bekerja dengan datetime.date
objek, dan hanya tertarik pada periode yang ditentukan oleh jumlah hari, apa perbedaan antara timedelta
dan relativedelta
? Apakah ada bedanya?
from datetime import date, timedelta
from dateutil.relativedelta import relativedelta
i = -1 # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)
dateime.timedelta
yang akan mencapai apa yang Anda inginkan dan hindari ketergantungan padadateutil
paket eksternal .Jawaban:
dateutil
adalah paket ekstensi untukdatetime
modul standar python . Seperti yang Anda katakan, ini menyediakan fungsionalitas ekstra, seperti lelt waktu yang diekspresikan dalam satuan yang lebih besar dari satu hari.Ini berguna jika Anda harus mengajukan pertanyaan seperti berapa bulan saya dapat menabung sebelum pacar saya berulang tahun, atau berapa bulan Jumat terakhir? Ini menyembunyikan kalkulasi kompleks yang disebabkan oleh panjang bulan yang berbeda, atau hari ekstra dalam tahun kabisat.
Dalam kasus Anda, Anda hanya tertarik pada jumlah hari. Jadi sebaiknya gunakan
timedelta
karena ini menghindari ketergantungan ekstra padadateutil
paket.sumber
A
relativedelta
memiliki lebih banyak parameter daripadatimedelta
:yang dengannya Anda dapat melakukan hal-hal seperti menghitung hari Jumat terakhir dalam sebulan:
In [14]: import datetime as dt In [15]: import dateutil.relativedelta as relativedelta In [16]: today = dt.date.today() In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1)) In [18]: today+rd Out[18]: datetime.date(2012, 9, 28)
sumber
Satu perbedaan utama yang tidak disorot dalam jawaban lain adalah adanya kata benda tunggal dan jamak untuk setiap perbedaan waktu primitif. Sementara
timedelta
hanya menawarkan kata benda jamak (misalnyahours
,days
) untuk menunjukkan perbedaan waktu relatif,relativedelta
menawarkan kata benda tunggal juga (misalnyahour
,day
) untuk menunjukkan informasi waktu absolut.Ini jelas dari definisi 2 kelas:
Sekarang, sebenarnya apa yang dilakukan bentuk tunggalnya? Bentuk tunggal membuat delta yang ketika ditambahkan ke
datetime
objek, menyetel tanggal / waktu tertentu primitif dalamdatetime
objek ke yang disebutkan direlativedelta
. Berikut ini contoh kecilnya:>>> import datetime as dt; from dateutil.relativedelta import * >>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31) >>> NOW datetime.datetime(2018, 11, 17, 9, 6, 31) >>> NOW + relativedelta(hours=1) #Simply add one hour datetime.datetime(2018, 11, 17, 10, 6, 31) >>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am datetime.datetime(2018, 11, 17, 1, 6, 31)
Ini bisa menyebabkan
relativedelta
digunakannya beberapa aplikasi menarik, yang dapat menjadi rumit untuk diterapkan menggunakantimedelta
. Salah satu yang cepat terlintas dalam pikiran adalah pembulatan.Aplikasi yang Menarik: Pembulatan Cepat
Sekarang saya akan menunjukkan cara
relativedelta
yang lebih ekspresif saat melakukan pembulatan adatetime
objek ke menit, jam, hari terdekat, dll.Pembulatan ke jam terdekat:
Perhatikan betapa mudahnya membulatkan menggunakan
relativedelta
:#Using `relativedelta` NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0) #Using `timedelta` dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)
Pembulatan lain yang lebih rumit mudah dicapai dengan menggunakan
relativedelta
. Namun, perhatikan bahwa semua pembulatan yang dapat dilakukanrelativedelta
juga dapat dilakukan dengan menggunakandatetime
fungsi dantimedelta
, hanya dengan cara yang sedikit lebih berbelit-belit.sumber