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

Например, из переменной даты вы можете извлечь основные функции, такие как,

  • Месяц
  • Четверть
  • Семестр
  • Год
  • День
  • День недели
  • Выходные или нет
  • Разница во времени в году / месяцах / днях и т. Д.

Давай попробуем.

Набор данных:

Я возьму пример набора данных из недавнего конкурса веб-сайта Analytics Vidhya - Loan Default Challenge.

Вы можете скачать набор данных здесь.

Теперь возьмем переменную даты Date.of.Birth из набора данных и продолжим работу.

Импорт пакетов и набора данных:

import pandas as pd
import numpy as np 
import datetime
cols = ['Date.of.Birth', 'DisbursalDate']
data = pd.read_csv('train.csv',usecols=cols, nrows = 100)

Преобразование в DateTime Datatype:

Первый шаг - преобразовать тип данных столбца в DateTime. Это можно сделать с помощью метода .to_datetime () в Pandas.

data['Date.of.Birth']= pd.to_datetime(data['Date.of.Birth']) 
data['DisbursalDate']= pd.to_datetime(data['DisbursalDate'])
data.dtypes

Series.dt:

Series.dt можно использовать для доступа к значениям ряда переменной datetime и возврата нескольких свойств в виде массива numpy.

Некоторые из его атрибутов

pandas.Series.dt.year возвращает год даты и времени.
pandas.Series.dt.month возвращает месяц даты и времени.
pandas.Series.dt.day возвращает день даты и времени.
pandas.Series.dt.quarter возвращает квартал даты и времени.

Месяц от даты:

data['month'] = data['Date.of.Birth'].dt.month
data[['Date.of.Birth','month']].head()

День от даты:

data['day'] = data['Date.of.Birth'].dt.day
data[['Date.of.Birth','day']].head()

Год от даты:

data['year'] = data['Date.of.Birth'].dt.year
data[['Date.of.Birth','year']].head()

Квартал с даты:

data['quarter'] = data['Date.of.Birth'].dt.quarter
data[['Date.of.Birth','quarter']].head()

Семестр с даты:

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

Кварталы 1 и 2 как семестр 1

остальное, четверть 3 и 4 как семестр 2

data['semester'] = np.where(data.quarter.isin([1,2]),1,2)
data[['Date.of.Birth','semester']].head()

День недели от даты:

Атрибут series.dt.dayofweek возвращает массив numpy, содержащий день недели переменной DateTime с Monday = 0 & Sunday = 6

data['dayofweek'] = data['Date.of.Birth'].dt.dayofweek
data[['Date.of.Birth','dayofweek']].head()

Точно так же атрибут series.dt.weekday_name возвращает массив с названием дня недели.

data['dayofweek_name'] = data['Date.of.Birth'].dt.weekday_name
data[['Date.of.Birth','dayofweek_name']].head()

Выходной день или нет:

Мы можем определить, является ли день выходным или нет, снова используя простую функцию isin, которая присваивает субботу и воскресенье 1, а остальным дням - 0.

data['is_weekend'] = np.where(data['dayofweek_name'].isin(['Sunday','Saturday']),1,0)
data[['Date.of.Birth','is_weekend']].head()

Разница между двумя датами:

Функция datetime.today возвращает текущую местную дату. Поэтому в приведенном ниже примере текущая дата - дата времени даст нам возраст заявителя.

(datetime.datetime.today() - data['Date.of.Birth']).head()

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

Помимо этого, есть другие атрибуты метода series.dt, которые вы можете попробовать,

  • pandas.series.dt.hour
  • pandas.series.dt.second
  • pandas.series.dt.minute
  • pandas.series.dayofyear
  • pandas.series.dt.date
  • pandas.series.dt.time
  • pandas.series.dt.freq
  • pandas.series.weekofyear

Поскольку ни один алгоритм машинного обучения не сможет взглянуть на объект datetime и автоматически сделать вывод о вышеизложенном, простые шаги, подобные этим, обеспечивают возможность понимания набора данных.

Надеюсь, эта статья была вам чем-то полезна. Удачного обучения :)