Вопрос:
У меня есть фрейм данных pandas с двумя столбцами, которые содержат даты. Я хочу знать количество лет между двумя датами и учет високосных лет.
Пример данных:
date_end date_start 2010-02-09 1933-03-03 2010-03-19 1924-04-08 2010-04-19 1924-04-08 2010-09-06 1924-04-08 2010-09-24 1924-04-08 2010-01-09 1933-04-29 2010-02-26 1933-04-29 2010-01-31 1953-06-10 2010-07-07 1928-11-14 2010-12-01 1974-11-17
date_start и date_end относятся к типу datetime. Я хочу, чтобы новый столбец был числом лет между двумя датами. Просто получить количество дней между двумя датами (df[‘diff’] = df.date_end — df.date_start), но затем я столкнулся с проблемой, так как количество лет, прошедших за определенное количество дней, зависит от “когда” произошли дни из-за високосных лет.
Это аналогично возрасту человека. Я попытался адаптировать ряд решений к подобным вопросам, но многие вопросы касаются количества дней или недель между двумя датами. У меня уже есть способ получить количество лет без учета високосных лет, но я хочу быть более правильным, чем это.
Ответ №1
Предполагая, что вы хотите определить год как 365 дней, вы можете сделать это:
>> df date_end date_start is_leapyear 0 2016-02-28 2015-02-28 0 1 2017-02-28 2016-02-28 1 2 2018-02-28 2017-02-28 0 >> df[‘diff_in_days’] = df[‘date_end’] — df[‘date_start’] >> df[‘diff_in_years’] = df[«diff_in_days»] / timedelta(days=365) >> print df[[«date_end», «date_start», «diff_in_years»]] >> df date_end date_start is_leapyear diff_in_years 0 2016-02-28 2015-02-28 0 1.00000 1 2017-02-28 2016-02-28 1 1.00274 2 2018-02-28 2017-02-28 0 1.00000
Как вы можете видеть, по годам с дополнительными днями (29 февраля) прошло больше времени между датами. В вашем случае это будет:
date_end date_start diff_in_years 0 2010-02-09 1933-03-03 76.991781 1 2010-03-19 1924-04-08 86.002740 2 2010-04-19 1924-04-08 86.087671 3 2010-09-06 1924-04-08 86.471233 4 2010-09-24 1924-04-08 86.520548 5 2010-01-09 1933-04-29 76.750685 6 2010-02-26 1933-04-29 76.882192 7 2010-01-31 1953-06-10 56.682192 8 2010-07-07 1928-11-14 81.698630 9 2010-12-01 1974-11-17 36.063014
С другой стороны, если вы просто хотите разницу в годах. т.е. вычесть год, в который были сделаны даты (без учета того, когда в этом году произошла дата). Тогда вы можете сделать это:
df[‘date_end_year’] = df.date_end.apply(lambda x: x.year) df[‘date_start_year’] = df.date_start.apply(lambda x: x.year) df[‘diff_in_years’] = df[‘date_end_year’] — df[‘date_start_year’] print df[[«date_end», «date_start», «diff_in_years»]] date_end date_start diff_in_years 0 2016-02-28 2015-02-28 1 1 2017-02-28 2016-02-28 1 2 2018-02-28 2017-02-28 1
В вашем случае это будет:
date_end date_start diff_in_years 0 2010-02-09 1933-03-03 77 1 2010-03-19 1924-04-08 86 2 2010-04-19 1924-04-08 86 3 2010-09-06 1924-04-08 86 4 2010-09-24 1924-04-08 86 5 2010-01-09 1933-04-29 77 6 2010-02-26 1933-04-29 77 7 2010-01-31 1953-06-10 57 8 2010-07-07 1928-11-14 82 9 2010-12-01 1974-11-17 36