Как посчитать возраст в годах между текущей датой и датой рождения в Python
Что проверяют
Умеете ли вы работать с календарём, а не с количеством дней. Для data-ml следом почти всегда просят то же самое для колонки в pandas, без цикла по строкам.
Как отвечать
Для одной даты правильный способ: разница лет минус единица, если день рождения в этом году ещё не наступил. Сравнение кортежей делает это в одну строку:
age = today.year - born.year - ((today.month, today.day) < (born.month, born.day))
Работайте с date, а не с datetime: берите date.today(), иначе в расчёт влезут время суток и часовой пояс. Если данные в UTC, а пользователь живёт в другом поясе, «сегодня» считайте в его поясе через zoneinfo.
Пограничные случаи, которые стоит назвать самим:
- 29 февраля: кортежное сравнение засчитывает день рождения в невисокосный год 1 марта. Это одна из принятых конвенций, но не единственная, требование лучше уточнить;
- дата в будущем: формула вернёт отрицательное число. Это ошибка данных, её ловят явно, а не отдают дальше;
- пропуски:
NoneилиNaTв колонке.
Для таблицы то же выражение векторизуется: колонку приводят через pd.to_datetime, берут .dt.year, .dt.month, .dt.day и вычитают булеву маску «день рождения ещё не наступил». Готовый вариант из сторонней библиотеки: relativedelta(today, born).years из dateutil.
Где спотыкаются
Делят разницу в днях на 365 или 365.25. Около дня рождения такой расчёт ошибается на год, и на большой выборке это заметная доля строк.
Ищут у timedelta атрибут лет. Его нет: timedelta хранит только дни, секунды и микросекунды.
Прогоняют функцию через df.apply построчно на миллионах строк. Работает, но в разы медленнее векторного варианта, и на собеседовании по data-ml это отмечают.