仅使用天数时,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)
dateime.timedelta
即可实现您想要的并避免对外部 dateutil
包的依赖。
dateutil
是 Python 标准 datetime
模块的扩展包。正如您所说,它提供了额外的功能,例如以大于一天的单位表示的时间增量。
如果您必须问一些问题,例如在我女朋友的生日到来之前我可以存多少个月,或者这个月的最后一个星期五是什么时候,这很有用?这隐藏了由不同月份长度或闰年额外天数引起的复杂计算。
就您而言,您只对天数感兴趣。因此,您最好使用 timedelta
,因为这样可以避免对 dateutil
包的额外依赖。
relativedelta
比 timedelta
有更多的参数:
定义:relativedelta.relativedelta(self, dt1=None, dt2=None, 年=0, 月=0, 天=0, 闰日=0, 周=0, 小时=0, 分钟=0, 秒=0, 微秒= 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)
其他答案中未突出显示的一个主要区别是每个时间差原语都存在单数和复数名词。虽然 timedelta
仅提供复数名词(例如 hours
、days
)来表示相对时间差异,但 relativedelta
也提供单数名词(例如 hour
、day
)来表示绝对时间信息。
这从 2 个类的定义中可以清楚地看出:
定义:datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, week]]]]]]]) 定义:relativedelta.relativedelta(self, dt1=None, dt2=None,年=0,月=0,日=0,闰日=0,周=0,小时=0,分钟=0,秒=0,微秒=0,年=无,月=无,日=无,工作日=无,年=无,nlyearday=无,小时=无,分钟=无,秒=无,微秒=无)
现在,单数形式究竟是做什么的?单数形式创建一个增量,当添加到 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
实现这些应用程序可能会很复杂。很快想到的一个是四舍五入。
一个有趣的应用程序:快速四舍五入
现在,我将向您展示在将 datetime
对象四舍五入到最接近的分钟、小时、天等时,relativedelta
如何更具表现力。
四舍五入到最近的小时:
请注意使用 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
完成,只是以稍微复杂一些的方式。