使用 datetime.timedelta 添加年份

pat*_*ick 11 python datetime timedelta python-dateutil

我正在用 Python 做一些时间计算。

目标:

其中一部分是试图:

给定一个日期,加上时间间隔(X 年,X 个月,X 周),返回日期

IE

  • 输入参数:input_time (datetime.date), interval (datetime.timedelta)
  • 返回:datetime.date

我查看了 datetime 和datetime.timedelta 文档

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, week=0)¶。

如果我想增加一定数量的小时数或周数,这些似乎效果很好。然而,

问题:

  • 我正在尝试实施诸如日期 + 1 年之类的操作,但无法弄清楚

例如

start = datetime.datetime(2000, 1, 1)
# expected output: datetime.datetime(2001, 1, 1)


# with the weeks, etc arguments given in timedelta, this fails unsurprisingly e.g 
start + datetime.timedelta(weeks = 52)

# returns datetime.datetime(2000, 12, 30, 0, 0)

Run Code Online (Sandbox Code Playgroud)

  • 使用 datetime 的基本工具是否可以进行基于年份的操作 - 如果可以,我将如何进行?

  • 我意识到对于年份示例,我可以只做start.replace(year = 2001),但是如果我有几个月或几周的输入,这种方法就会失败。

  • 根据我的理解,dateutil库具有更高级的功能,但我不清楚它与内置 datetime 对象的交互情况如何。

我已经回顾了这个类似的问题 但它并没有帮助我解决这个问题。

任何帮助深表感谢!

在 MacO 上运行 Python 3.6.5。

wim*_*wim 24

timedelta 不支持年份,因为一年的持续时间取决于哪一年(例如,闰年有 2 月 29 日)。

您可以使用 arelativedelta代替,它确实支持years并考虑添加的基线日期:

>>> from dateutil.relativedelta import relativedelta
>>> now = datetime.now()
>>> now 
datetime.datetime(2019, 1, 27, 19, 4, 11, 628081)
>>> now + relativedelta(years=1)
datetime.datetime(2020, 1, 27, 19, 4, 11, 628081)
Run Code Online (Sandbox Code Playgroud)

  • @patrick 可能太晚了你对语法 `years=+1` 的评论;这意味着前进或后退,所以如果你必须倒退一年,你会做“years=-1”。从文档中:“相对信息,可能是否定的(参数是复数);添加或减去具有相对信息的relativedelta 使用relativedelta 中的信息对原始日期时间值执行相应的算术运算。 (2认同)

小智 8

您可以使用替换来硬编码日期时间的新年份值:) 这避免了闰年等。

year_later = current.replace(year=current.year + 1)
Run Code Online (Sandbox Code Playgroud)

  • 但如果当前是 2 月 29 日,闰年又如何呢? (2认同)

JDe*_*an6 5

我的快速而肮脏的方法是使用

y = [number of years]
timedelta(days= y * 365)
Run Code Online (Sandbox Code Playgroud)

我发现这个问题正在寻找更优雅的解决方案。对于我的用途来说,不需要精确的答案。在这种特殊情况下,我不介意每个闰年损失一天。