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


90

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)

3
日付間の日数のデルタのみに関心がある場合は、標準ライブラリを使用するだけで、目的dateime.timedeltaを達成し、外部dateutilパッケージへの依存を回避できます。
ペドロロマーノ

1つの余分な依存関係を保存することに加えて、日付間の日数でのデルタの計算は、relativedeltaよりもtimedeltaの方が数倍高速であることに注意してください。(〜10回)
Julien B.

回答:


76

dateutilPython標準datetimeモジュールの拡張パッケージです。あなたが言うように、それは1日より大きい単位で表されるタイムデルタなどの追加機能を提供します。

これは、ガールフレンドの誕生日が来るまでに何ヶ月節約できるか、その月の最後の金曜日は何月かなどの質問をする必要がある場合に役立ちます。これにより、月の長さの違い、またはうるう年の余分な日によって引き起こされる複雑な計算が隠されます。

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


32

Aに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)

これを使用して、月の最後の金曜日を計算するなどのことができます。

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
これは、「その月の最後の金曜日」などに相対デルタを使用するという新しい洞察を与えた素晴らしい答えです:)ありがとう!
pascalVKooten 2017

10

他の回答で強調されていない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。すぐに頭に浮かぶのは四捨五入です。

興味深いアプリケーション:すばやく丸める

ここでrelativedeltadatetimeオブジェクトを最も近い分、時間、日などに丸めるときに、より表現力が高いことを示します。

最も近い時間への四捨五入:

以下を使用して四捨五入するのがいかに簡単であるかに注意して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を使用して実行することもできますが、少し複雑な方法でのみ実行できることに注意してください。datetimetimedelta

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.