在 python 中添加年份
Adding years in python
如果我想在我的程序中添加 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()
你不能只加上 100 * 365 天,因为在那个时间跨度中有 366 天的闰年。在你的 100 年跨度中,你错过了 25 天。
最好在此处使用 datetime.replace()
method:
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)
The number of seconds in a year is not fixed. Think you know how many days are in a year? Think again.
要执行周期(日历)算术,您可以使用 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
是闰年。
如果您想要添加的唯一单位是年,那么您可以仅使用标准库来实现它:
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
man 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)))
在过去的 5 年里,我一直在使用 pandas Timestamp and Timedelta 来处理所有与日期相关的事情。
例如,要将字符串格式的任何日期加上 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')
如果我想在我的程序中添加 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()
你不能只加上 100 * 365 天,因为在那个时间跨度中有 366 天的闰年。在你的 100 年跨度中,你错过了 25 天。
最好在此处使用 datetime.replace()
method:
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)
The number of seconds in a year is not fixed. Think you know how many days are in a year? Think again.
要执行周期(日历)算术,您可以使用 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
是闰年。
如果您想要添加的唯一单位是年,那么您可以仅使用标准库来实现它:
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
man 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)))
在过去的 5 年里,我一直在使用 pandas Timestamp and Timedelta 来处理所有与日期相关的事情。
例如,要将字符串格式的任何日期加上 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')