Python timedelta以年为单位

问题描述 投票:137回答:14

我需要检查自某个日期以来是否已有数年的时间。目前,我已经从timedelta模块获得了datetime,但我不知道如何将其转换为年份。

python datetime timedelta
14个回答
153
投票

您需要的不只是timedelta,它还告诉您已经过去了多少年;您还需要知道开始(或结束)日期。 (这是year年。)

您最好的选择是使用dateutil.relativedelta object,但这是第三方模块。如果您想知道某个日期后datetime年(默认为现在)的n,则可以执行以下操作::

from dateutil.relativedelta import relativedelta

def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    return from_date - relativedelta(years=years)

如果您愿意使用标准库,答案会稍微复杂一些::

from datetime import datetime
def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    try:
        return from_date.replace(year=from_date.year - years)
    except ValueError:
        # Must be 2/29!
        assert from_date.month == 2 and from_date.day == 29 # can be removed
        return from_date.replace(month=2, day=28,
                                 year=from_date.year-years)

如果是2/29,而18年前还没有2/29,则此函数将返回2/28。如果您希望返回3/1,只需将最后一个return语句更改为::

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)

您的问题最初是说您想知道自某个日期以来已有多少年了。假设您想要整数年,则可以基于每年365.25天进行猜测,然后使用上面定义的yearsago函数之一进行检查::

def num_years(begin, end=None):
    if end is None:
        end = datetime.now()
    num_years = int((end - begin).days / 365.25)
    if begin > yearsago(num_years, end):
        return num_years - 1
    else:
        return num_years

49
投票

[如果您要检查某人是否18岁,由于using年,在某些极端情况下使用timedelta将无法正常工作。例如,某位出生于2000年1月1日的人将在2018年1月1日正好6575天后(包括5个leap年)年满18岁,但是某位2001年1月1日出生的人将在1月1日后6574天后正好18岁2019(包括4个leap年)。因此,如果您的年龄恰好是6574天,就无法确定他们是17岁还是18岁,而无需知道更多有关其出生日期的信息。


9
投票

首先,在最详细的级别上,无法完全解决问题。年份长短不一,对于年份长短,没有明确的“正确选择”。


6
投票

这里有一个更新的DOB函数,它以与人类相同的方式计算生日:


4
投票

获得天数,然后除以365.2425(平均公历年)为年。除以30.436875(平均公历月)为月份。


1
投票

您需要的精确度如何?如果您担心leap年,td.days / 365.25将使您非常接近。


1
投票
def age(dob):
    import datetime
    today = datetime.date.today()

    if today.month < dob.month or \
      (today.month == dob.month and today.day < dob.day):
        return today.year - dob.year - 1
    else:
        return today.year - dob.year

>>> import datetime
>>> datetime.date.today()
datetime.date(2009, 12, 1)
>>> age(datetime.date(2008, 11, 30))
1
>>> age(datetime.date(2008, 12, 1))
1
>>> age(datetime.date(2008, 12, 2))
0

1
投票

然而这里未提到的另一个第三方库是mxDateTime(python datetime和第三方timeutil的前身)可以用于此任务。


1
投票

最后,您所拥有的是一个数学问题。如果每隔4年我们有额外的一天,那么可以在几天之内(而不是365天,而是365 * 4 + 1)潜水timedelta,那么您的时间就是4年。然后再将其除以4。timedelta /((365 * 4)+1)/ 4 = timedelta * 4 /(365 * 4 +1)


1
投票

这是我制定的解决方案,希望能对您有所帮助;-)


0
投票

即使此线程已经死了,我还是可以针对我面临的这个同样的问题提出可行的解决方案。在这里(日期是格式为dd-mm-yyyy的字符串):


0
投票

此函数返回两个日期之间的年差(以ISO格式作为字符串,但可以轻松修改以采用任何格式)


0
投票

我会建议Pyfdate


0
投票
import datetime

def check_if_old_enough(years_needed, old_date):

    limit_date = datetime.date(old_date.year + years_needed,  old_date.month, old_date.day)

    today = datetime.datetime.now().date()

    old_enough = False

    if limit_date <= today:
        old_enough = True

    return old_enough



def test_ages():

    years_needed = 30

    born_date_Logan = datetime.datetime(1988, 3, 5)

    if check_if_old_enough(years_needed, born_date_Logan):
        print("Logan is old enough")
    else:
        print("Logan is not old enough")


    born_date_Jessica = datetime.datetime(1997, 3, 6)

    if check_if_old_enough(years_needed, born_date_Jessica):
        print("Jessica is old enough")
    else:
        print("Jessica is not old enough")


test_ages()
© www.soinside.com 2019 - 2024. All rights reserved.