web-dev-qa-db-ja.com

日のみで作業する場合の「datetime.timedelta」と「dateutil.relativedelta.relativedelta」の違いは何ですか?

違いは何ですか - datetime.timedelta (Pythonの標準ライブラリから)および dateutil.relativedelta.relativedelta 日のみで作業する場合

私が理解する限り、timedeltaは日(および週)のみをサポートしますが、relativedeltaは年、月、週、または日で定義された期間のサポートを追加し、年、月、または日。 (この質問の目的のために、時間、分、秒について心配する必要はないことを覚えておいてください)

私は datetime.date オブジェクト、および日数で定義された期間のみに関心がある場合、timedeltarelativedeltaの違いは何ですか?違いはありますか?

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)
65

dateutilはpython standard datetimeモジュールの拡張パッケージです。あなたが言うように、それはより大きな単位で表現されるtimedeltasなどの追加機能を提供します一日。

これは、ガールフレンドの誕生日が来るまでに何ヶ月節約できるのか、またはその月の最後の金曜日は何ですかなどの質問をする必要がある場合に便利です。これにより、月の長さが異なること、またはうるう年の余分な日が原因で発生する複雑な計算が隠されます。

あなたの場合、あなたは日数だけに興味があります。したがって、timedeltaパッケージへの余分な依存関係を回避するため、dateutilを使用するのが最適です。

62
Hans Then

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)
24
unutbu

他の回答で強調されていない大きな違いの1つは、各時間差プリミティブに単数と複数の名詞が存在することです。 timedeltaは複数の名詞(例:hoursdays)のみを提供して相対的な時間差を示しますが、relativedeltaは単数の名詞(例:hourday)は絶対時間情報を示します。

これは、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を使用しても実行できますが、少し複雑な方法でしか実行できません。

5
shivams