繁体   English   中英

在 Python 中查找两个日期之间的年差,余数以天表示

[英]Find difference between two dates in years, with the remainder expressed in days, in Python

如果 output 应该以年表示,余数以天表示,如何找到两个日期之间的差异?

示例 1 :如果这两个日期分别是June 1, 1981August 23, 2001,那么结果应该是20 years and 83 days

示例 2 :如果两个日期分别为January 1, 2002December 30, 2003,则结果应为1 year and 363 days

我不关心结果的格式 我只需要知道计算年数和天数的最 Pythonic 方式。

谢谢!

使用内置模块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 天的月份和一个 28 天的月份的混合。 所以,一般来说,你不能用它来获取天数。 我建议编写 function 以获得所需形式的差异。

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'

您需要使用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM