当前位置: 首页 > 知识库问答 >
问题:

当只处理天时,“datetime.timedelta”和“dateutil.relativedelta.Relative Delta”之间有什么区别?

郎诚
2023-03-14

datetime.timedelta(来自Python的标准库)和dateutil.relativedelta.relativedelta之间的区别是什么?

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

考虑到我只使用datetime.date对象,并且只对由天数定义的时间段感兴趣,那么timedelta相对delta之间有什么区别?有什么区别吗?

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个答案

孙泳
2023-03-14

其他答案中没有突出的一个主要区别是每个时差基元都存在单数和复数名词。虽然时间delta仅提供复数名词(例如小时)来表示相对时间差,但相对delta也提供单数名词(例如小时)来表示绝对时间信息。

从 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 对象中的特定日期/时间基元设置为相对详图中提到的日期/时间基元。下面是一个小示例:

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

这可能会导致< code>relativedelta用于一些有趣的应用程序,使用< code>timedelta实现起来可能会很复杂。很快想到的一个是四舍五入。

现在,我将向您展示在将日期时间对象舍入到最接近的分钟,小时,天等时,相对delta如何更具表现力。

请注意,使用相对详限进行舍入是多么简单:

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

其他更复杂的舍入可以使用相对详限值轻松实现。但是,请注意,相对详图可以完成的所有舍入也可以使用日期时间函数和时间详限来完成,只是以稍微复杂的方式完成。

司立果
2023-03-14

相对详图时间详限具有更多的参数:

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)
越雨泽
2023-03-14

dateutil是python标准datetimemodule的扩展包。正如您所说,它提供了额外的功能,例如以大于一天的单位表示的时间增量。

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

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

 类似资料:
  • 问题内容: (来自Python的标准库)和仅工作数天有什么区别? 据我了解,仅支持几天(和几周),而增加了对根据年,月,周或天定义的时间段以及为年,月或天定义的绝对值的支持。 (请记住,出于这个问题的目的,我不必担心小时,分钟或秒) 考虑到我只能用工作对象,只关心用的天数定义的时间段,有什么之间的区别和?有什么区别吗? 问题答案: 是python标准模块的扩展包。如您所说,它提供了额外的功能,例如

  • 我的工作应该使用并行技术,我是python的新用户。因此,我想知道您是否可以分享一些关于python和模块的资料。这两者有什么区别?

  • 问题内容: 我正在学习如何在Python中使用和模块来并行运行某些操作并加速我的代码。 我发现很难理解一个对象与一个对象之间的区别是什么(也许是因为我没有任何理论背景)。 另外,对我来说,如何实例化一个作业队列并使其只有4个(例如)并行运行,而另一个则等待资源释放后再执行,对我来说也不是很清楚。 我发现文档中的示例很清楚,但并不十分详尽。一旦我尝试使事情复杂化,我就会收到很多奇怪的错误(例如无法腌

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 我在编写一个非常庞大的mib时遇到了问题,因为我只有一个代理与许多没有snmp的设备连接。所有设备都通过推送将相同类型的数据发送到代理,然后代理将snmp陷阱发送到snmp管理器。此外,Manager正在向代理发送SNMP GET。我想编写一个标准的mib,它适用于每个设备,管理器只需发送一些OID来获取对应的值,而不是数百个OID。一个非常庞大的mib意味着有很多分支。

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中