使用 datetime.timedelta 添加年份
Using datetime.timedelta to add years
我正在 Python 中进行一些时间计算。
目标:
其中一部分是试图:
给定一个日期,加上时间间隔(X年,X月,X周),return日期
即
- 输入参数:input_time(datetime.date),间隔(datetime.timedelta)
- return: datetime.date
我查看了日期时间 datetime.timedelta docs
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=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 库具有更多高级功能,但我不清楚它与内置日期时间对象的交互效果如何。
我已经查看了这个类似的 question 但它对我没有帮助。
非常感谢任何帮助!
运行 Python MacOs 上的 3.6.5。
timedelta
不支持年份,因为一年的长短取决于哪一年(例如闰年有2月29日)。
您可以使用 relativedelta
instead (from PyPI package python-dateutil
),它确实支持 years
并考虑了添加的基准日期。
>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> d = datetime.date(2020, 2, 29)
>>> d
datetime.date(2020, 2, 29)
>>> d + relativedelta(years=1)
datetime.date(2021, 2, 28)
您可以使用替换来硬编码日期时间的新年份值:)
这避免了闰年等
year_later = current.replace(year=current.year + 1)
请注意,如果当前日期恰好是 2 月 29 日,这将引发 ValueError
消息:“日期超出月份范围”。所以你需要处理这种特殊情况,像这样:
if current.month == 2 and current.day == 29:
year_later = current.replace(year=current.year + 1, day=28)
else:
year_later = current.replace(year=current.year + 1)
我的快捷方式是使用
y = [number of years]
timedelta(days= y * 365)
我发现这个问题是在寻找更优雅的解决方案。对于我的用途,不需要精确的答案。在这种特殊情况下,我不介意每个闰年损失一天。
我的目标与你的非常相似。我想有相同的日期,就在明年。但我想我无法避免考虑闰年。最后,一切都归结为需求到底是什么。从理论上讲,我们可以只添加 365 天(如果有 2 月 29 日,则放宽一天),或者如果有 2 月 29 日,则检查接下来的 365 天,在这种情况下再添加 1 天。
但是检查会很复杂,最后我使用了一个简单的检查新日期是否与原来的日期不同,然后再添加 1 天。
我知道 dateutil.relativedelta 更容易,但我想在没有额外导入的情况下做到这一点
演示:
from datetime import datetime, timedelta
dates = [datetime(1999, 1, 1),
datetime(1999, 12, 31),
datetime(2000, 1, 1),
datetime(2019, 3, 1),
datetime(2019, 1, 1),
datetime(2020, 1, 1),
datetime(2020, 3, 1),
datetime(2020, 2, 29)
]
for date in dates:
plus1year_date = date + timedelta(days=365)
print(date, "\t - original date")
print(plus1year_date, "\t - plus1year_date (+365 days)")
if date.day != plus1year_date.day:
plus1year_date = plus1year_date + timedelta(days=1)
print(plus1year_date, "\t - plus1year_date adjusted for leap year")
else:
print("No need to adjust for leap year")
print('--------------------------------------------------------------')
# Expected output:
# 1999-01-01 00:00:00 - original date
# 2000-01-01 00:00:00 - plus1year_date (+365 days)
# No need to adjust for leap year
# --------------------------------------------------------------
# 1999-12-31 00:00:00 - original date
# 2000-12-30 00:00:00 - plus1year_date (+365 days)
# 2000-12-31 00:00:00 - plus1year_date adjusted for leap year
# --------------------------------------------------------------
# 2000-01-01 00:00:00 - original date
# 2000-12-31 00:00:00 - plus1year_date (+365 days)
# 2001-01-01 00:00:00 - plus1year_date adjusted for leap year
# --------------------------------------------------------------
# ...
编辑:@MDoe - 我忘了提到使用 .year + 1 方法,如果日期是 2 月 29 日(值错误)。
此外,如果有人想添加一个可能包含多个闰年的间隔,那么我的代码将不正确。
我正在 Python 中进行一些时间计算。
目标:
其中一部分是试图:
给定一个日期,加上时间间隔(X年,X月,X周),return日期
即
- 输入参数:input_time(datetime.date),间隔(datetime.timedelta)
- return: datetime.date
我查看了日期时间 datetime.timedelta docs
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=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 库具有更多高级功能,但我不清楚它与内置日期时间对象的交互效果如何。
我已经查看了这个类似的 question 但它对我没有帮助。
非常感谢任何帮助!
运行 Python MacOs 上的 3.6.5。
timedelta
不支持年份,因为一年的长短取决于哪一年(例如闰年有2月29日)。
您可以使用 relativedelta
instead (from PyPI package python-dateutil
),它确实支持 years
并考虑了添加的基准日期。
>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> d = datetime.date(2020, 2, 29)
>>> d
datetime.date(2020, 2, 29)
>>> d + relativedelta(years=1)
datetime.date(2021, 2, 28)
您可以使用替换来硬编码日期时间的新年份值:)
这避免了闰年等
year_later = current.replace(year=current.year + 1)
请注意,如果当前日期恰好是 2 月 29 日,这将引发 ValueError
消息:“日期超出月份范围”。所以你需要处理这种特殊情况,像这样:
if current.month == 2 and current.day == 29:
year_later = current.replace(year=current.year + 1, day=28)
else:
year_later = current.replace(year=current.year + 1)
我的快捷方式是使用
y = [number of years]
timedelta(days= y * 365)
我发现这个问题是在寻找更优雅的解决方案。对于我的用途,不需要精确的答案。在这种特殊情况下,我不介意每个闰年损失一天。
我的目标与你的非常相似。我想有相同的日期,就在明年。但我想我无法避免考虑闰年。最后,一切都归结为需求到底是什么。从理论上讲,我们可以只添加 365 天(如果有 2 月 29 日,则放宽一天),或者如果有 2 月 29 日,则检查接下来的 365 天,在这种情况下再添加 1 天。 但是检查会很复杂,最后我使用了一个简单的检查新日期是否与原来的日期不同,然后再添加 1 天。 我知道 dateutil.relativedelta 更容易,但我想在没有额外导入的情况下做到这一点
演示:
from datetime import datetime, timedelta
dates = [datetime(1999, 1, 1),
datetime(1999, 12, 31),
datetime(2000, 1, 1),
datetime(2019, 3, 1),
datetime(2019, 1, 1),
datetime(2020, 1, 1),
datetime(2020, 3, 1),
datetime(2020, 2, 29)
]
for date in dates:
plus1year_date = date + timedelta(days=365)
print(date, "\t - original date")
print(plus1year_date, "\t - plus1year_date (+365 days)")
if date.day != plus1year_date.day:
plus1year_date = plus1year_date + timedelta(days=1)
print(plus1year_date, "\t - plus1year_date adjusted for leap year")
else:
print("No need to adjust for leap year")
print('--------------------------------------------------------------')
# Expected output:
# 1999-01-01 00:00:00 - original date
# 2000-01-01 00:00:00 - plus1year_date (+365 days)
# No need to adjust for leap year
# --------------------------------------------------------------
# 1999-12-31 00:00:00 - original date
# 2000-12-30 00:00:00 - plus1year_date (+365 days)
# 2000-12-31 00:00:00 - plus1year_date adjusted for leap year
# --------------------------------------------------------------
# 2000-01-01 00:00:00 - original date
# 2000-12-31 00:00:00 - plus1year_date (+365 days)
# 2001-01-01 00:00:00 - plus1year_date adjusted for leap year
# --------------------------------------------------------------
# ...
编辑:@MDoe - 我忘了提到使用 .year + 1 方法,如果日期是 2 月 29 日(值错误)。 此外,如果有人想添加一个可能包含多个闰年的间隔,那么我的代码将不正确。