Python “与”的区别是什么;datetime.timedelta“;及;dateutil.relativedelta.relativedelta”的;如果只工作几天?

Python “与”的区别是什么;datetime.timedelta“;及;dateutil.relativedelta.relativedelta”的;如果只工作几天?,python,datetime,timedelta,Python,Datetime,Timedelta,(来自Python的标准库)与仅使用天的情况有什么区别 据我所知,timedelta仅支持天(和周),而relativedelta增加了对以年、月、周或天定义的期间的支持,并定义了年、月或天的绝对值。(记住,就这个问题而言,我不必担心小时、分钟或秒) 考虑到我只处理对象,只对天数定义的周期感兴趣,timedelta和relativedelta之间有什么区别?有什么区别吗 from datetime import date, timedelta from dateutil.relativedelt

(来自Python的标准库)与仅使用天的情况有什么区别

据我所知,
timedelta
仅支持天(和周),而
relativedelta
增加了对以年、月、周或天定义的期间的支持,并定义了年、月或天的绝对值。(记住,就这个问题而言,我不必担心小时、分钟或秒)

考虑到我只处理对象,只对天数定义的周期感兴趣,
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标准
datetime
模块的扩展包。正如您所说,它提供了额外的功能,例如以大于一天的单位表示的时间增量

如果你要问一些问题,比如在我女朋友的生日到来之前我能存多少个月,或者一个月的最后一个星期五是什么,这很有用?这隐藏了由不同长度的月份或闰年中的额外天数引起的复杂计算


在您的情况下,您只对天数感兴趣。因此,您最好使用
timedelta
,因为这样可以避免对
dateutil
包的额外依赖。

A
relativedelta
比A
timedelta有更多的参数:

您可以使用它计算一个月内的最后一个星期五:

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
)来表示绝对时间信息

从两类的定义可以清楚地看出这一点:

现在,单数形式到底是做什么的?单数形式创建一个增量,当添加到
datetime
对象时,该增量将
datetime
对象中的特定日期/时间原语设置为
relativedelta
中提到的日期/时间原语。下面是一个小例子:

>将日期时间导入为dt;从dateutil.relativedelta导入*
>>>现在=日期时间(2018,11,17,9,6,31)
>>>现在
datetime.datetime(2018,11,17,9,6,31)
>>>现在+relativedelta(小时=1)#只需加上一小时即可
datetime.datetime(2018,11,17,10,6,31)
>>>现在+relativedelta(小时=1)#将小时设置为凌晨01:00
datetime.datetime(2018,11,17,1,6,31)
这可能导致将
relativedelta
用于一些有趣的应用程序,使用
timedelta
实现这些应用程序可能会很复杂。一个很快就浮现在脑海中的是四舍五入

一个有趣的应用:快速取整 现在,我将向您展示
relativedelta
在将
datetime
对象四舍五入到最接近的分钟、小时、天等时如何更具表现力

四舍五入到最近的一小时: 请注意,使用
relativedelta进行四舍五入是多么简单:

#使用“relativedelta”`
现在+relativedelta(小时=1,分钟=0,秒=0,微秒=0)
#使用` timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0))+dt.timedelta(0,60*60,0)

使用
relativedelta
可以轻松实现其他更复杂的舍入。但是,请注意,
relativedelta
可以完成的所有舍入操作也可以使用
datetime
函数和
timedelta
完成,只需以稍微复杂的方式完成。

如果您只对日期之间几天的delta感兴趣,只需使用标准库的
dateime.timedelta
,它将实现您想要的功能,并避免对外部
dateutil
包的依赖。值得一提的是,除了保存一个额外的依赖项外,使用timedelta计算日期之间天数的delta比relativedelta快数倍。(~10次)这是一个非常好的答案,它为“本月最后一个星期五”之类的事情提供了使用relativedelta的新见解:)谢谢!
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)
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)