python/pandas найти количество лет между датами

Вопрос: У меня есть фрейм данных 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 относятся к типу

Вопрос:

У меня есть фрейм данных 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

Оцените статью
Добавить комментарий