我正在用Python做一些时间计算。
部分原因是:
给出日期,添加时间间隔(X年,X个月,X周),返回日期
即
我查看了日期时间和datetime.timedelta docs
类datetime.timedelta(天= 0,秒= 0,微秒= 0,毫秒= 0,分钟= 0,小时= 0,星期= 0)¶
如果我想增加一定的小时数或星期数,这些方法似乎效果很好。但是,
例如
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。
答案 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)
我发现这个问题正在寻找更优雅的解决方案。对于我的用途,不需要精确的答案。在这种特殊情况下,我不介意每个闰年损失一天。