October 8, 2021

Главные объекты для работы с датой и временем в Pandas

Модели машинного обучения, базирующиеся на временных рядах, требуют хороших навыков обработки даты и времени. В этой статье рассмотрим основные объекты, представляющий необходимый функционал в Pandas.

Метки даты и времени

Для меток даты и времени в Pandas предназначен тип Timestamp - аналог datetime.datetime из стандартной библиотеки Python и основанный на типе numpy.datetime64. Конструкция из нескольких Timestamp называется DatetimeIndex. Проще всего создать Timestamp, используя строчную нотацию:

pd.Timestamp('2017-01-01 12:23:34')
pd.DatetimeIndex(['2017-01-01 12:23:34', '2015-01-06 12:1:34', '2018-11-01 12:23:4'])[2]

Чтобы сгенерировать диапазон Timestamp, следует воспользоваться функцией date_range. На вход ей можно задать комбинацию из трех параметров среди следующих: start, end, periods, freq (начало, конец, количество периодов, частота):

Период времени

Соответствующий объект представлен классом Period, который основан на типе numpy.datetime64. Список "периодов" хранится в PeriodIndex.

pd.Period('4Q2005')
pd.PeriodIndex(['4Q2005', '4Q2006', '4Q2007'], freq='Q-DEC')[1]

Справочник значений частот можно найти в официальной документации. Для генерации диапазонов периодов удобно использовать функцию period_range:

# pr = pd.period_range('2021-02-01', periods=10, freq='S')
pr = pd.period_range('2021-02-01', '2021-03-01', freq='D')
pr

Как можно заметить, в period_range мы вольны использовать любую из двух комбинаций параметров: начало периода, их количество + частота или начало и конец периода + частота.

Временные промежутки

Для временных продолжительностей существует специальный тип Timedelta - аналог datetime.timedelta и основанный на numpy.timedelta64. Массив таких объектов - TimedeltaIndex по аналогии с временными метками может быть создан путем вызова функции timedelta_range с тройкой из параметров start, end, periods, freq (начало, конец, количество периодов, частота):

pd.options.display.max_seq_items = 15
# td = pd.timedelta_range('1 days', '5 days', freq='H')
# td = pd.timedelta_range('1 days', periods=10, freq='H')
td = pd.timedelta_range('1 days', '5 days', periods=1)
td