在Python中添加年份

问题描述 投票:0回答:4

如果我想在程序中添加 100 年,为什么它显示错误的日期?

import datetime
stringDate= "January 10, 1920"
dateObject= datetime.datetime.strptime(stringDate, "%B %d, %Y")
endDate= dateObject+datetime.timedelta(days=100*365)
print dateObject.date()
print endDate.date()
python datetime python-3.x python-datetime
4个回答
21
投票

一年的秒数不固定您知道一年有多少天吗?再想想。

要执行周期(日历)算术,您可以使用

dateutil.relativedelta
:

#!/usr/bin/env python
from datetime import date
from dateutil.relativedelta import relativedelta # $ pip install python-dateutil

print(date(1920, 1, 10) + relativedelta(years=+100))
# -> 2020-01-10

要理解为什么

d.replace(year=d.year + 100)
失败,请考虑:

print(date(2000, 2, 29) + relativedelta(years=+100))
2100-02-28

请注意,

2100
不是闰年,而
2000
是闰年。

如果您想要添加的唯一单位是年,那么您可以仅使用 stdlib 来实现它:

from calendar import isleap

def add_years(d, years):
    new_year = d.year + years
    try:
        return d.replace(year=new_year)
    except ValueError:
        if (d.month == 2 and d.day == 29 and # leap day
            isleap(d.year) and not isleap(new_year)):
            return d.replace(year=new_year, day=28)
        raise

示例:

from datetime import date

print(add_years(date(1920, 1, 10), 100))
# -> 2020-01-10
print(add_years(date(2000, 2, 29), 100))
# -> 2100-02-28
print(add_years(date(2000, 2, 29), 4))
# -> 2004-02-29

16
投票

您不能只添加 100 * 365 天,因为该时间跨度中有 366 天的闰年。在你的 100 年跨度中,你错过了 25 天。

最好只使用

datetime.replace()
方法

endDate = dateObject.replace(year=dateObject.year + 100)

对于闰年的 2 月 29 日,这仍然可能会失败,因为根据您添加的年数,您最终会得到无效的日期。在这种情况下,您可以退回到 2 月 28 日,或者使用 3 月 31 日;处理抛出的异常并切换到您选择的替换:

years = 100
try:
    endDate = dateObject.replace(year=dateObject.year + years)
except ValueError:
    # Leap day in a leap year, move date to February 28th
    endDate = dateObject.replace(year=dateObject.year + years, day=28)

演示:

>>> import datetime
>>> dateObject = datetime.datetime(1920, 1, 10, 0, 0)
>>> dateObject.replace(year=dateObject.year + 100)
datetime.datetime(2020, 1, 10, 0, 0)

1
投票

人 3 mktime

做过C的人都知道答案。

mktime 自动将溢出的值添加到下一个更大的单元。您只需将其转换回日期时间即可。

例如,您可以输入 2019-07-40,它将转换为 2019-08-09。

>>> datetime.fromtimestamp(mktime((2019, 7, 40, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 8, 9, 0, 0)

或将 2019-03-(-1) 转换为 2019-02-27:

>>> datetime.fromtimestamp(mktime((2019, 3, -1, 0, 0, 0, 0, 0, 0)))
datetime.datetime(2019, 2, 27, 0, 0)

所以你只需使用你的旧日期并添加你喜欢的任何内容即可:

now = datetime.datetime.now()
hundred_days_later = datetime.datetime.fromtimestamp(mktime((now.year, now.month, now.day + 100, now.hour, now.minute, now.second, 0, 0, 0)))

0
投票

在过去的 5 年里,我一直在使用 pandas TimestampTimedelta 来处理所有与日期相关的事情。

例如,要为字符串格式的任何日期添加 3 年:

date = "2003-07-01"
date_start = Timestamp(date)
date_end = Timestamp(date_start.year+3, date_start.month, date_start.day)
date_end
# Out:
Timestamp('2006-07-01 00:00:00')

要在日期上添加 40 天,请使用 Timedelta (它不支持年份,否则我们可以使用它来解决最后一个问题):

date_end = date_start + Timedelta(40, unit="days")
date_end
# Out:
Timestamp('2003-08-10 00:00:00')
© www.soinside.com 2019 - 2024. All rights reserved.