Как я могу найти возраст в python с сегодняшнего дня и дату рождения людей? Дата рождения — от DateField в модели Django.
tkalve 07 фев. 2010, в 18:42
Поделиться
Если стандартного модуля datetime недостаточно, вы можете попробовать: labix.org/python-dateutil
Tomasz Zielinski 07 фев. 2010, в 17:46
Это почти наверняка было решено: dateutil.relativedelta.relativedelta
Williams 18 нояб. 2012, в 15:02
Поделиться:
16 ответов
Лучший ответ
Это можно сделать гораздо проще, учитывая, что int (True) равен 1 и int (False) равно 0:
from datetime import date def calculate_age(born): today = date.today() return today.year — born.year — ((today.month, today.day) < (born.month, born.day))
Danny W. Adair 17 март 2012, в 23:46
Поделиться
date.today() : date.today() возвращает дату в местном часовом поясе, которая может отличаться от места рождения. Возможно, вам придется использовать часовые пояса явно
jfs 11 дек. 2015, в 15:43
Это, вероятно, зависит от вашего определения «возраст». Во всех практических целях день рождения обычно указывается как дата, а не как дата / время с учетом часового пояса (т. Е. «Рожденный» пропускает детали). Большинство людей не рождаются ровно в полночь (поэтому обычно наблюдают преждевременно :-)), и когда я нахожусь в другом часовом поясе, я предполагаю, что большинство людей отмечают свой день рождения по местному времени (это то, что я делаю, я живу на 10-12 часов вперед моего места рождения). Если бы «рожденный» был датой времени с учетом часового пояса, вы могли бы использовать арифметику pytz и normalize () — может быть, это интересно для астрологического программного обеспечения?
Приложение «Часы» на python (питон)
Danny W. Adair 13 дек. 2015, в 04:26
Я полностью согласен в контексте человеческих возрастов, но ваша формула может быть использована в более широком контексте. Хотя я лично никогда не отмечаю свой день рождения даже на час раньше из-за семейных традиций и, будучи программистом, легко вычислить время, где бы я ни находился.
jfs 13 дек. 2015, в 16:35
какой формат родился
pyd 10 нояб. 2017, в 14:50
kjagiello 19 март 2018, в 14:07
привет Дэнни, умный, но в то же время не очень питонический. Извините, что так сказал.
Andy K 18 окт. 2018, в 15:51
Показать ещё 4 комментария
from datetime import date def calculate_age(born): today = date.today() try: birthday = born.replace(year=today.year) except ValueError: # raised when birth date is February 29 and the current year is not a leap year birthday = born.replace(year=today.year, month=born.month+1, day=1) if birthday > today: return today.year — born.year — 1 else: return today.year — born.year
Обновление: Используйте решение Danny, лучше
mpen 14 фев. 2010, в 02:26
Поделиться
В принципе, ваш блок except должен перехватывать только одно конкретное исключение, которое может быть вызвано.
Daenyth 23 июнь 2010, в 13:29
mpen 23 июнь 2010, в 18:25
Я даже дошел до того, что проверил сообщение об исключении, чтобы убедиться, что оно того, чего я ожидаю. Даже с приведенным выше кодом, существует вероятность, что выдается ValueError, но это не тот ValueError, который вы ожидаете.
Пишем программу на python для вычета вашего возраста
Randy Syring 12 июль 2011, в 19:45
+ для исключения, но, есть ли проблема в моем def calculate_age(dob) ? Я думаю, что это довольно просто.
Grijesh Chauhan 21 янв. 2014, в 06:35
mpen 21 янв. 2014, в 23:41
Grijesh Chauhan 22 янв. 2014, в 07:12
mpen 22 янв.
2014, в 16:45
Предыдущая версия считала, что кто-то с DOB 2012-02-29 будет считаться 1-летним на 2013-02-28, а я нет. Я изменил это, чтобы им не было одного года до 1 марта, как я это вижу. Все тесты проходят.
qris 14 март 2014, в 17:21
mpen 14 март 2014, в 19:40
Это кажется слишком длинным для задачи, и imho также неэффективно (новая дата через replace (), обработка исключений . ). Просто вычтите год рождения из этого года и вычтите еще 1, если месяц и день в будущем — см. Мой ответ ниже. И, конечно, кортеж (2, 29) больше, чем кортеж (2, 28) .
Danny W. Adair 23 март 2014, в 03:41
mpen 23 март 2014, в 03:47
Danny W. Adair 23 март 2014, в 03:55
Показать ещё 10 комментариев
from datetime import date days_in_year = 365.2425 age = int((date.today() — birth_date).days / days_in_year)
В Python 3 вы можете выполнить деление на datetime.timedelta :
from datetime import date, timedelta age = (date.today() — birth_date) // timedelta(days=365.2425)
TheOne 28 янв. 2011, в 14:04
Поделиться
каждый четвертый год является високосным, за исключением того, что каждый сотый год не является високосным, за исключением того, что каждый четвертый год является високосным. попробуй days_in_year = 365,2425
Dan 10 июль 2013, в 14:00
jfs 23 март 2014, в 17:30
Это не работает для некоторых дат: (date(2017, 3, 1) — date(2004, 3, 1)) / timedelta(days=365.2425) должно возвращать 13 , но возвращает 12 . Без цвета, результат составляет 12.999582469181433 .
href_ 01 март 2017, в 08:37
Показать ещё 1 комментарий
from dateutil.relativedelta import * from datetime import date today = date.today() dob = date(1982, 7, 5) age = relativedelta(today, dob) >>relativedelta(years=+33, months=+11, days=+16)’
Arun Kumar Khattri 21 июнь 2016, в 14:55
Поделиться
Самый простой способ — использовать python-dateutil
import datetime import dateutil def birthday(date): # Get the current date now = datetime.datetime.utcnow() now = now.date() # Get the difference between the current date and the birthday age = dateutil.relativedelta.relativedelta(now, date) age = age.years return age
user1569050 17 сен. 2012, в 22:54
Поделиться
Это не работает правильно, когда день рождения 29 февраля, а сегодняшняя дата 28 февраля (будет действовать так, как будто сегодня 29 февраля).
Trey Hunner 10 март 2013, в 03:22
from datetime import date def age(birth_date): today = date.today() y = today.year — birth_date.year if today.month < birth_date.month or today.month == birth_date.month and today.day < birth_date.day: y -= 1 return y
gzerone 22 фев. 2012, в 03:42
Поделиться
какой формат на день рождения
pyd 10 нояб. 2017, в 14:54
экземпляр даты или что-то подобное, docs.python.org/3/library/datetime.html#datetime.date, опечатка исправлена.
gzerone 12 нояб. 2017, в 01:56
К сожалению, вы не можете просто использовать timedelata, поскольку наибольшая единица, которую он использует, — это день и високосные годы, что сделает ваши вычисления недействительными. Поэтому пусть найдет число лет, затем скорректируется на один, если последний год не заполнен:
from datetime import date birth_date = date(1980, 5, 26) years = date.today().year — birth_date.year if (datetime.now() — birth_date.replace(year=datetime.now().year)).days >= 0: age = years else: age = years — 1
Upd:
Это решение действительно вызывает исключение, когда вступает в игру 29 февраля. Здесь правильная проверка:
from datetime import date birth_date = date(1980, 5, 26) today = date.today() years = today.year — birth_date.year if all((x >= y) for x,y in zip(today.timetuple(), birth_date.timetuple()): age = years else: age = years — 1
UPD2:
Вызов нескольких вызовов на now() поражает производительность, это не имеет значения во всех, кроме исключительно особых случаях. Настоящей причиной использования переменной является риск несогласованности данных.
Alexander Lebedev 07 фев. 2010, в 18:54
Поделиться
Спасибо, я узнал об этом, выполнив несколько тестов, и в результате получил похожий код, найденный по ссылке AndiDog.
tkalve 07 фев. 2010, в 17:50
Удар 1: вы используете datetime.datetime вместо datetime.date. Удар 2: Ваш код уродлив и неэффективен. Вызов datetime.now () три раза ?? Забастовка 3: дата рождения 29 февраля 2004 года и сегодняшняя дата 28 февраля 2010 года должны вернуть возраст 6, а не вопить «ValueError: день вне диапазона для месяца». Вы вышли!
John Machin 07 фев. 2010, в 21:10
К сожалению, ваш код «Upd» еще более барочный и сломанный, чем первая попытка — ничего общего с 29 февраля; он терпит неудачу в МНОГИХ простых случаях, таких как 2009-06-15 — 2010-07-02 . человеку, очевидно, немногим более 1 года, но вы вычитаете год, потому что тест в дни (2> = 15) не пройден. И, очевидно, вы не проверяли его — он содержит синтаксическую ошибку.
John Machin 08 фев. 2010, в 03:46
Показать ещё 1 комментарий
Классическая версия в этом сценарии — это то, что делать с людьми, родившимися 29-го февраля. Пример: вам нужно быть в возрасте 18 лет, чтобы проголосовать, водить машину, покупать алкоголь и т.д. если вы родились в 2004-02-29, то, что в первый день вам разрешено делать такие вещи: 2022-02 -28, или 2022-03-01? AFAICT, в основном первый, но несколько killjoys могут сказать последнее.
Здесь код, который обслуживает 0,068% (приблизительно) населения, родившегося в этот день:
def age_in_years(from_date, to_date, leap_day_anniversary_Feb28=True): age = to_date.year — from_date.year try: anniversary = from_date.replace(year=to_date.year) except ValueError: assert from_date.day == 29 and from_date.month == 2 if leap_day_anniversary_Feb28: anniversary = datetime.date(to_date.year, 2, 28) else: anniversary = datetime.date(to_date.year, 3, 1) if to_date < anniversary: age -= 1 return age if __name__ == «__main__»: import datetime tests = «»» 2004 2 28 2010 2 27 5 1 2004 2 28 2010 2 28 6 1 2004 2 28 2010 3 1 6 1 2004 2 29 2010 2 27 5 1 2004 2 29 2010 2 28 6 1 2004 2 29 2010 3 1 6 1 2004 2 29 2012 2 27 7 1 2004 2 29 2012 2 28 7 1 2004 2 29 2012 2 29 8 1 2004 2 29 2012 3 1 8 1 2004 2 28 2010 2 27 5 0 2004 2 28 2010 2 28 6 0 2004 2 28 2010 3 1 6 0 2004 2 29 2010 2 27 5 0 2004 2 29 2010 2 28 5 0 2004 2 29 2010 3 1 6 0 2004 2 29 2012 2 27 7 0 2004 2 29 2012 2 28 7 0 2004 2 29 2012 2 29 8 0 2004 2 29 2012 3 1 8 0 «»» for line in tests.splitlines(): nums = [int(x) for x in line.split()] if not nums: print continue datea = datetime.date(*nums[0:3]) dateb = datetime.date(*nums[3:6]) expected, anniv = nums[6:8] age = age_in_years(datea, dateb, anniv) print datea, dateb, anniv, age, expected, age == expected
2004-02-28 2010-02-27 1 5 5 True 2004-02-28 2010-02-28 1 6 6 True 2004-02-28 2010-03-01 1 6 6 True 2004-02-29 2010-02-27 1 5 5 True 2004-02-29 2010-02-28 1 6 6 True 2004-02-29 2010-03-01 1 6 6 True 2004-02-29 2012-02-27 1 7 7 True 2004-02-29 2012-02-28 1 7 7 True 2004-02-29 2012-02-29 1 8 8 True 2004-02-29 2012-03-01 1 8 8 True 2004-02-28 2010-02-27 0 5 5 True 2004-02-28 2010-02-28 0 6 6 True 2004-02-28 2010-03-01 0 6 6 True 2004-02-29 2010-02-27 0 5 5 True 2004-02-29 2010-02-28 0 5 5 True 2004-02-29 2010-03-01 0 6 6 True 2004-02-29 2012-02-27 0 7 7 True 2004-02-29 2012-02-28 0 7 7 True 2004-02-29 2012-02-29 0 8 8 True 2004-02-29 2012-03-01 0 8 8 True
John Machin 07 фев. 2010, в 23:49
Поделиться
И я недавно только что узнал о високосной секунде .
Bobort 13 янв. 2017, в 19:15
Развернувшись на Danny Solution, но со всеми возможными способами сообщать о возрасте для молодых людей (заметьте, сегодня datetime.date(2015,7,17) ):
def calculate_age(born): »’ Converts a date of birth (dob) datetime object to years, always rounding down. When the age is 80 years or more, just report that the age is 80 years or more. When the age is less than 12 years, rounds down to the nearest half year. When the age is less than 2 years, reports age in months, rounded down. When the age is less than 6 months, reports the age in weeks, rounded down.
When the age is less than 2 weeks, reports the age in days. »’ today = datetime.date.today() age_in_years = today.year — born.year — ((today.month, today.day) < (born.month, born.day)) months = (today.month — born.month — (today.day < born.day)) %12 age = today — born age_in_days = age.days if age_in_years >= 80: return 80, ‘years or older’ if age_in_years >= 12: return age_in_years, ‘years’ elif age_in_years >= 2: half = ‘and a half ‘ if months > 6 else » return age_in_years, ‘%syears’%half elif months >= 6: return months, ‘months’ elif age_in_days >= 14: return age_in_days/7, ‘weeks’ else: return age_in_days, ‘days’
print ‘%d %s’ %calculate_age(datetime.date(1933,6,12)) # >=80 years print ‘%d %s’ %calculate_age(datetime.date(1963,6,12)) # >=12 years print ‘%d %s’ %calculate_age(datetime.date(2010,6,19)) # >=2 years print ‘%d %s’ %calculate_age(datetime.date(2010,11,19)) # >=2 years with half print ‘%d %s’ %calculate_age(datetime.date(2014,11,19)) # >=6 months print ‘%d %s’ %calculate_age(datetime.date(2015,6,4)) # >=2 weeks print ‘%d %s’ %calculate_age(datetime.date(2015,7,11)) # days old 80 years or older 52 years 5 years 4 and a half years 7 months 6 weeks 7 days
Dannid 18 июль 2015, в 02:19
Поделиться
Если вы хотите распечатать это на странице с помощью шаблонов django, может потребоваться следующее:
Anoyz 19 окт. 2013, в 02:31
Поделиться
Не используйте Джанго |timesince для расчета timedelta в течение нескольких лет , потому что не учитывает високосные года и , таким образом , дает неточные результаты. Смотрите Django билет № 19210 для получения дополнительной информации об этом.
jnns 13 нояб. 2013, в 11:39
Не знал этого. Благодарю.
Anoyz 22 нояб.
2013, в 11:46
Вот решение, чтобы найти возраст человека как годы или месяцы или дни.
Предположим, что дата рождения человека 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 лет
Вам нужно импортировать 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) возвращает возраст в формате строки.
Источник: overcoder.net
Написать программы на языке программирования Python. На проверку отправить скриншот выполненной программы и саму программу в формате* ру со всеми поясненияли решения.
Задачи.
1) Получить случайное трехзначное число, вывести это число и сумму его отдельных цифр.
2) Написать программу, которая рассчитывает возраст человека в часах.
kukurkudfir: print() — выводит число
буковка f там означает format. То, что в фигурных скобок, оно сразу форматируется в то, что заключенно в них. В первых скобках стоит number, следовательно там будет число, которое выбрано рандомно.
kukurkudfir: Во вторых фигурных скобках стоит функция sum, которая складывает все значения, переданные ей в аргументе, аргументом послужил список из цифр, сделанный генератором [int(x) for x in list(str(number))], который создает цикл for и проходится по всем цифрам number, переделанных в str(), так как в list() нельзя впихнуть цифры через list(). Далее цифры в str() переделываются обратно в int() и вставляются в список. Ну может я с генератором и замудрил, но решение верное
Источник: sous-otvet.net
Python функция, которая будет спрашивать возраст у человека, и вычтить возраст человека на среднестатистическую продолжительность человека [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу
Закрыт 2 года назад .
Python Нужно написать функцию, которая будет спрашивать возраст у человека, и вычтить возраст человека на среднестатистическую продолжительность человека Чтобы вывело в консоль сколько ему осталось до смерти. Прошу помочь всем неравнодушным Очень короткую программу, в пару строк кода
Источник: ru.stackoverflow.com