Возраст от даты рождения в питоне - PullRequest
140 голосов
/ 07 февраля 2010

Как я могу найти возраст в python от сегодняшней даты и даты рождения человека? Дата рождения - из DateField в модели Django.

Ответы [ 16 ]

2 голосов
/ 17 июля 2013

Вот решение, позволяющее определить возраст человека по годам, месяцам или дням.

Допустим, дата рождения человека 2012-01-17T00: 00: 00 Таким образом, его возраст 2013-01-16T00: 00: 00 будет 11 месяцев

или если он родился 2012-12-17T00: 00: 00 , его возраст на 2013-01-12T00: 00: 00 будет 26 дней

или если он родился 2000-02-29T00: 00: 00 , его возраст 2012-02-29T00: 00: 00 будет 12 лет

Вам понадобится import datetime .

Вот код:

def get_person_age(date_birth, date_today):

"""
At top level there are three possibilities : Age can be in days or months or years.
For age to be in years there are two cases: Year difference is one or Year difference is more than 1
For age to be in months there are two cases: Year difference is 0 or 1
For age to be in days there are 4 possibilities: Year difference is 1(20-dec-2012 - 2-jan-2013),
                                                 Year difference is 0, Months difference is 0 or 1
"""
years_diff = date_today.year - date_birth.year
months_diff = date_today.month - date_birth.month
days_diff = date_today.day - date_birth.day
age_in_days = (date_today - date_birth).days

age = years_diff
age_string = str(age) + " years"

# age can be in months or days.
if years_diff == 0:
    if months_diff == 0:
        age = age_in_days
        age_string = str(age) + " days"
    elif months_diff == 1:
        if days_diff < 0:
            age = age_in_days
            age_string = str(age) + " days"
        else:
            age = months_diff
            age_string = str(age) + " months"
    else:
        if days_diff < 0:
            age = months_diff - 1
        else:
            age = months_diff
        age_string = str(age) + " months"
# age can be in years, months or days.
elif years_diff == 1:
    if months_diff < 0:
        age = months_diff + 12
        age_string = str(age) + " months" 
        if age == 1:
            if days_diff < 0:
                age = age_in_days
                age_string = str(age) + " days" 
        elif days_diff < 0:
            age = age-1
            age_string = str(age) + " months"
    elif months_diff == 0:
        if days_diff < 0:
            age = 11
            age_string = str(age) + " months"
        else:
            age = 1
            age_string = str(age) + " years"
    else:
        age = 1
        age_string = str(age) + " years"
# The age is guaranteed to be in years.
else:
    if months_diff < 0:
        age = years_diff - 1
    elif months_diff == 0:
        if days_diff < 0:
            age = years_diff - 1
        else:
            age = years_diff
    else:
        age = years_diff
    age_string = str(age) + " years"

if age == 1:
    age_string = age_string.replace("years", "year").replace("months", "month").replace("days", "day")

return age_string

Некоторые дополнительные функции, используемые в вышеприведенных кодах:

def get_todays_date():
    """
    This function returns todays date in proper date object format
    """
    return datetime.now()

И

def get_date_format(str_date):
"""
This function converts string into date type object
"""
str_date = str_date.split("T")[0]
return datetime.strptime(str_date, "%Y-%m-%d")

Теперь нам нужно передать get_date_format () строками типа 2000-02-29T00: 00: 00

Он преобразует его в объект типа даты, который необходимо передать в get_person_age (date_birth, date_today) .

Функция get_person_age (date_birth, date_today) возвращает возраст в строковом формате.

1 голос
/ 10 июня 2018

Расширение до Дэнни В. Адэйр Ответ , чтобы получить месяц также

def calculate_age(b):
    t = date.today()
    c = ((t.month, t.day) < (b.month, b.day))
    c2 = (t.day< b.day)
    return t.year - b.year - c,c*12+t.month-b.month-c2
1 голос
/ 23 июня 2010

Так как я не видел правильную реализацию, я перекодировал мою таким образом ...

    def age_in_years(from_date, to_date=datetime.date.today()):
  if (DEBUG):
    logger.debug("def age_in_years(from_date='%s', to_date='%s')" % (from_date, to_date))

  if (from_date>to_date): # swap when the lower bound is not the lower bound
    logger.debug('Swapping dates ...')
    tmp = from_date
    from_date = to_date
    to_date = tmp

  age_delta = to_date.year - from_date.year
  month_delta = to_date.month - from_date.month
  day_delta = to_date.day - from_date.day

  if (DEBUG):
    logger.debug("Delta's are : %i  / %i / %i " % (age_delta, month_delta, day_delta))

  if (month_delta>0  or (month_delta==0 and day_delta>=0)): 
    return age_delta 

  return (age_delta-1)

Предположение о том, что 28 февраля ему "18", когда он родился 29-го февраля, просто неверно. Поменять границы можно не обращая внимания ... для моего кода это просто личное удобство:)

0 голосов
/ 05 февраля 2019
import datetime

Сегодняшняя дата

td=datetime.datetime.now().date() 

Ваша дата рождения

bd=datetime.date(1989,3,15)

Ваш возраст

age_years=int((td-bd).days /365.25)
0 голосов
/ 13 марта 2017

Слегка модифицированный Решение Дэнни для удобства чтения и понимания

    from datetime import date

    def calculate_age(birth_date):
        today = date.today()
        age = today.year - birth_date.year
        full_year_passed = (today.month, today.day) < (birth_date.month, birth_date.day)
        if not full_year_passed:
            age -= 1
        return age
0 голосов
/ 22 августа 2011

дата и время импорта

def age(date_of_birth):
    if date_of_birth > datetime.date.today().replace(year = date_of_birth.year):
        return datetime.date.today().year - date_of_birth.year - 1
    else:
        return datetime.date.today().year - date_of_birth.year

В вашем случае:

import datetime

# your model
def age(self):
    if self.birthdate > datetime.date.today().replace(year = self.birthdate.year):
        return datetime.date.today().year - self.birthdate.year - 1
    else:
        return datetime.date.today().year - self.birthdate.year
...