使用datetime.timedelta添加年份

时间:2019-01-28 00:56:41

标签: python datetime timedelta python-dateutil

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

目标:

部分原因是:

给出日期,添加时间间隔(X年,X个月,X周),返回日期

  • 输入参数:input_time(日期时间.date),间隔(datetime.timedelta)
  • 返回:datetime.date

我查看了日期时间和datetime.timedelta docs

  

类datetime.timedelta(天= 0,秒= 0,微秒= 0,毫秒= 0,分钟= 0,小时= 0,星期= 0)¶

如果我想增加一定的小时数或星期数,这些方法似乎效果很好。但是,

问题:

  • 我正在尝试执行 date + 1 year 之类的操作,但无法解决

例如

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)

问题

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

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

  • 据我所知, dateutil 库具有更高级的功能,但我不清楚它与内置datetime对象的交互程度如何。

我已经审查了类似的question,但并没有帮助我。

非常感谢您的帮助!

在MacO上运行Python 3.6.5。

3 个答案:

答案 0 :(得分:3)

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

您可以改用relativedelta,它支持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)

答案 1 :(得分:1)

您可以使用replace来硬编码日期时间的新年值:) 这样可以避免leap年等。

year_later = current.replace(year=current.year + 1)

答案 2 :(得分:0)

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

y = [number of years]
timedelta(days= y * 365)

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