Pandas: как рассчитать разницу между двумя датами


Вы можете использовать следующий синтаксис для вычисления разницы между двумя датами в кадре данных pandas:

df['diff_days'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'D')

В этом конкретном примере вычисляется разница между датами в столбцах end_date и start_date в днях.

Обратите внимание, что мы можем заменить «D» в функции timedelta64() следующими значениями для вычисления разницы дат в разных единицах измерения:

  • Вт : недели
  • М : Месяцы
  • Г : Годы

В следующих примерах показано, как на практике рассчитать разницу дат в кадре данных pandas.

Пример 1: вычислить разницу между двумя датами со столбцами даты и времени

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'start_date ': pd.date_range (start='1/5/2020', periods= 6 , freq='W'),
 'end_date ': pd.date_range (start='6/1/2020', periods= 6 , freq='M')})

#view DataFrame
print(df)

 start_date end_date
0 2020-01-05 2020-06-30
1 2020-01-12 2020-07-31
2 2020-01-19 2020-08-31
3 2020-01-26 2020-09-30
4 2020-02-02 2020-10-31
5 2020-02-09 2020-11-30

#view dtype of each column in DataFrame
df.dtypes

start_date datetime64[ns]
end_date datetime64[ns]
dtype: object

Поскольку оба столбца в DataFrame уже имеют dtype datetime64 , мы можем использовать следующий синтаксис для вычисления разницы между датами начала и окончания:

import numpy as np

#create new columns that contains date differences
df['diff_days'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'D')
df['diff_weeks'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'W')
df['diff_months'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'M')
df['diff_years'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'Y')

#view updated DataFrame
print(df)

 start_date end_date diff_days diff_weeks diff_months diff_years
0 2020-01-05 2020-06-30 177.0 25.285714 5.815314 0.484610
1 2020-01-12 2020-07-31 201.0 28.714286 6.603832 0.550319
2 2020-01-19 2020-08-31 225.0 32.142857 7.392349 0.616029
3 2020-01-26 2020-09-30 248.0 35.428571 8.148011 0.679001
4 2020-02-02 2020-10-31 272.0 38.857143 8.936528 0.744711
5 2020-02-09 2020-11-30 295.0 42.142857 9.692191 0.807683

Новые столбцы содержат разницу между датами начала и окончания в днях, неделях, месяцах и годах.

Пример 2. Расчет разницы между двумя датами со строковыми столбцами

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'start_date': ['2020-01-05', '2020-01-12', '2020-01-19'],
 'end_date': ['2020-06-30', '2020-07-31', '2020-08-31']})

#view dtype of each column
print(df.dtypes )

start_date object
end_date object
dtype: object

Поскольку ни один столбец в DataFrame не имеет dtype datetime64 , мы получим ошибку, если попытаемся вычислить разницу между датами:

import numpy as np

#attempt to calculate date difference
df['diff_days'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'D')

TypeError : unsupported operand type(s) for -: 'str' and 'str'

Сначала мы должны использовать pd.to_datetime для преобразования каждого столбца в формат даты и времени, прежде чем вычислять разницу между датами:

import numpy as np

#convert columns to datetime
df[['start_date',' end_date']] = df[['start_date',' end_date']].apply (pd.to_datetime )

#calculate difference between dates
df['diff_days'] =(df['end_date'] - df['start_date']) / np.timedelta64 ( 1 , 'D')

#view updated DataFrame
print(df)

 start_date end_date diff_days
0 2020-01-05 2020-06-30 177.0
1 2020-01-12 2020-07-31 201.0
2 2020-01-19 2020-08-31 225.0

Поскольку мы сначала преобразовали каждый столбец в формат даты и времени, мы смогли успешно вычислить разницу между датами без каких-либо ошибок.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

Как создать диапазон дат в Pandas
Как извлечь месяц из даты в Pandas
Как преобразовать отметку времени в дату и время в pandas

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.