違いは何ですか - datetime.timedelta
(Pythonの標準ライブラリから)および dateutil.relativedelta.relativedelta
日のみで作業する場合
私が理解する限り、timedelta
は日(および週)のみをサポートしますが、relativedelta
は年、月、週、または日で定義された期間のサポートを追加し、年、月、または日。 (この質問の目的のために、時間、分、秒について心配する必要はないことを覚えておいてください)
私は datetime.date
オブジェクト、および日数で定義された期間のみに関心がある場合、timedelta
とrelativedelta
の違いは何ですか?違いはありますか?
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)
dateutil
はpython standard datetime
モジュールの拡張パッケージです。あなたが言うように、それはより大きな単位で表現されるtimedeltasなどの追加機能を提供します一日。
これは、ガールフレンドの誕生日が来るまでに何ヶ月節約できるのか、またはその月の最後の金曜日は何ですかなどの質問をする必要がある場合に便利です。これにより、月の長さが異なること、またはうるう年の余分な日が原因で発生する複雑な計算が隠されます。
あなたの場合、あなたは日数だけに興味があります。したがって、timedelta
パッケージへの余分な依存関係を回避するため、dateutil
を使用するのが最適です。
relativedelta
には、timedelta
よりも多くのパラメーターがあります。
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None, years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0, seconds=0, microseconds=0, year=None, month=None, day=None, weekday=None, yearday=None, nlyearday=None, hour=None, minute=None, second=None, microsecond=None)
1か月の最後の金曜日の計算などを行うことができます。
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)
他の回答で強調されていない大きな違いの1つは、各時間差プリミティブに単数と複数の名詞が存在することです。 timedelta
は複数の名詞(例:hours
、days
)のみを提供して相対的な時間差を示しますが、relativedelta
は単数の名詞(例:hour
、day
)は絶対時間情報を示します。
これは、2つのクラスの定義から明らかです。
Definition: datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) Definition: relativedelta.relativedelta(self, dt1=None, dt2=None, years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0, seconds=0, microseconds=0, year=None, month=None, day=None, weekday=None, yearday=None, nlyearday=None, hour=None, minute=None, second=None, microsecond=None)
さて、単数形は正確に何をしますか?特異形式は、datetime
オブジェクトに追加されたときに、datetime
オブジェクトの特定の日付/時刻プリミティブをrelativedelta
で指定されたものに設定するデルタを作成します。以下に小さな例を示します。
>>> 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)
これにより、いくつかの興味深いアプリケーションにrelativedelta
が使用される可能性があり、timedelta
を使用して実装するのは複雑になる可能性があります。すぐに思い浮かぶのは、四捨五入です。
relativedelta
オブジェクトを最も近い分、時間、日などに丸めるときに、datetime
がより表現力豊かであることを示します。
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)
他のより複雑な四捨五入は、relativedelta
を使用して簡単に達成できます。ただし、relativedelta
で実行できるすべての丸めは、datetime
関数とtimedelta
を使用しても実行できますが、少し複雑な方法でしか実行できません。