计算两个日期之间的年差,余数以天表示,在 Python
Find difference between two dates in years, with the remainder expressed in days, in Python
如果输出应该以年表示,余数以天表示,如何找到两个日期之间的差异?
示例 1:如果两个日期是 June 1, 1981
和 August 23, 2001,
那么结果应该是 20 years and 83 days
.
示例 2:如果两个日期是 January 1, 2002
和 December 30, 2003,
那么结果应该是 1 year and 363 days
.
我不关心结果的格式;我只需要知道计算年数和天数的最 Pythonic 方法。
谢谢!
您需要使用 datetime 和 relativedelta 模块。
import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime.datetime(1981,6,1)
end_date = datetime.datetime(2002,1,1)
difference_in_years = relativedelta(end_date, start_date)
print(difference_in_years)
使用内置模块datetime
,您可以轻松获取天数。
>>> import datetime
>>> foo = datetime.date(2001, 8, 23) - datetime.date(1981, 6, 1)
>>> foo
datetime.timedelta(days=7388)
>>> foo.days
7388
>>> bar = datetime.date(2003, 12, 30) - datetime.date(2002, 1, 1)
>>> bar
datetime.timedelta(days=728)
>>> bar.days
728
dateutil
模块可以给你年数,但是月数也丢进去了
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> relativedelta(datetime.date(2001, 8, 23), datetime.date(1981, 6, 1))
relativedelta(years=+20, months=+2, days=+22)
>>> relativedelta(datetime.date(2003, 12, 30), datetime.date(2002, 1, 1))
relativedelta(years=+1, months=+11, days=+29)
不过,在使用月数时要小心。一个月和一天没有定义。上一示例中的 11 个月是 6 个 31 天的月份、4 个 30 天的月份和 1 个 28 天的月份的组合。所以,一般来说,你不能用它来获取天数。我建议写一个函数来获得你想要的形式的差异。
import calendar
import datetime
from dateutil.relativedelta import relativedelta
def get_delta(date2, date1):
'''calculate the delta between two datetime.date objects (date2 the newer date)'''
number_of_leap_years = sum(1
for yr in range(date1.year, date2.year + 1)
if calendar.isleap(yr))
number_of_years = relativedelta(date2, date1).years
total_number_of_days = (date2 - date1).days
number_of_days = total_number_of_days
- 365 * number_of_years
- number_of_leap_years
return f'{number_of_years} years, {number_of_days} days'
如果输出应该以年表示,余数以天表示,如何找到两个日期之间的差异?
示例 1:如果两个日期是 June 1, 1981
和 August 23, 2001,
那么结果应该是 20 years and 83 days
.
示例 2:如果两个日期是 January 1, 2002
和 December 30, 2003,
那么结果应该是 1 year and 363 days
.
我不关心结果的格式;我只需要知道计算年数和天数的最 Pythonic 方法。
谢谢!
您需要使用 datetime 和 relativedelta 模块。
import datetime
from dateutil.relativedelta import relativedelta
start_date = datetime.datetime(1981,6,1)
end_date = datetime.datetime(2002,1,1)
difference_in_years = relativedelta(end_date, start_date)
print(difference_in_years)
使用内置模块datetime
,您可以轻松获取天数。
>>> import datetime
>>> foo = datetime.date(2001, 8, 23) - datetime.date(1981, 6, 1)
>>> foo
datetime.timedelta(days=7388)
>>> foo.days
7388
>>> bar = datetime.date(2003, 12, 30) - datetime.date(2002, 1, 1)
>>> bar
datetime.timedelta(days=728)
>>> bar.days
728
dateutil
模块可以给你年数,但是月数也丢进去了
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> relativedelta(datetime.date(2001, 8, 23), datetime.date(1981, 6, 1))
relativedelta(years=+20, months=+2, days=+22)
>>> relativedelta(datetime.date(2003, 12, 30), datetime.date(2002, 1, 1))
relativedelta(years=+1, months=+11, days=+29)
不过,在使用月数时要小心。一个月和一天没有定义。上一示例中的 11 个月是 6 个 31 天的月份、4 个 30 天的月份和 1 个 28 天的月份的组合。所以,一般来说,你不能用它来获取天数。我建议写一个函数来获得你想要的形式的差异。
import calendar
import datetime
from dateutil.relativedelta import relativedelta
def get_delta(date2, date1):
'''calculate the delta between two datetime.date objects (date2 the newer date)'''
number_of_leap_years = sum(1
for yr in range(date1.year, date2.year + 1)
if calendar.isleap(yr))
number_of_years = relativedelta(date2, date1).years
total_number_of_days = (date2 - date1).days
number_of_days = total_number_of_days
- 365 * number_of_years
- number_of_leap_years
return f'{number_of_years} years, {number_of_days} days'