Pandas date_range: Как Создать Диапазон Дат в Pandas

В этом уроке мы глубоко погрузимся в один из самых необходимых и универсальных инструментов библиотеки Pandas — функцию date_range. Независимо от того, только ли вы начинаете изучать мощь Pandas или уже являетесь опытным пользователем, эта функция определенно должна быть в вашем арсенале Python. Это расширит ваши возможности работы с датами и временем в Pandas.

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

Наденьте шапочку знаний и пристегнитесь, вас ждет захватывающее путешествие в удивительный мир Pandas и функции date

Оглавление

Функция диапазона дат Pandas

Давайте посмотрим на функцию date_range Pandas, доступную в Pandas. Функция предоставляет большое количество различных параметров и аргументов по умолчанию.

# Understanding the Pandas date_range Function
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, inclusive=None)

Прежде чем продолжить, давайте немного подробнее рассмотрим эти параметры. Важно отметить, что для работы функции должно быть указано ровно три из следующих четырех параметров: start=, end=, periods=, and freq=.

ПараметрОписаниеАргумент по умолчаниюПринятые значения

start

Левая граница для генерации дат

None

string or datetime-like

end

Правильная граница для генерации дат

None

string or datetime-like

periods

Количество периодов для генерации

None

int

freq

Частоты, используемые для генерации диапазонов

D

string or Dateoffset

tz

Имя часового пояса для значений даты и времени с учетом часового пояса.

None

string or timezone info

normalize

Следует ли нормализовать даты начала и окончания до полуночи перед созданием диапазона дат.

False

boolean

name

Имя результирующего DatetimeIndex

None

string

inclusive

Какие границы включить

'both'

{“both”, “neither”, “left”, “right”}

Функция заменила предыдущий параметр closed= на гораздо более мощный параметр inclusive= в январе 2022 года в версии 1.4.

Давайте теперь перейдем к созданию нашего первого диапазона дат с использованием функции date_range() в Pandas.

Создание простого диапазона дат с помощью Pandas date_range

Самый простой тип диапазона дат, который мы можем создать с помощью функции date_range() в Pandas, - это указать начальную дату, конечную дату и частоту (которая по умолчанию установлена как “D” для дней). Давайте посмотрим, как мы можем создать диапазон дат, который включает в себя дни с 1 июля 2023 года по 7 июля 2023 года:

# Create a Simple Date Range in Pandas
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-07')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04',
            #    '2023-07-05', '2023-07-06', '2023-07-07'],
            #   dtype='datetime64[ns]', freq='D')

В указанном выше блоке кода мы создаем объект диапазона дат Pandas с использованием функции pd.date_range(). В этом случае мы передали только два аргумента, соответствующие параметрам start= и end=. По умолчанию функция будет использовать частоту 'D', что означает разделение каждого значения по дням.

Давайте изучим этот объект dates немного подробнее, распечатав его тип:

# Checking the Type of a Date Range Object
print(type(dates))

# Returns:
# <class 'pandas.core.indexes.datetimes.DatetimeIndex'>

При осмотре типа объекта можно увидеть, что он возвращает DatetimeIndex. Это означает, что Pandas создает очень производительный объект.

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

Создание диапазонов дат с настраиваемыми частотами в Pandas

В Pandas по умолчанию используется частота 'D', что означает, что каждый элемент находится на расстоянии одного дня друг от друга. Однако мы также можем указать наши собственные частоты, используя строку частот. В таблице ниже приведены некоторые важные строки частот. Это аналогично извлечению частей даты из даты в Pandas.

ПсевдонимОписание

B

частота рабочих дней

C

пользовательская частота рабочих дней

D

частота календарных дней

W

еженедельная частота

M

частота окончания месяца

SM

частота окончания полумесяца (15-е число и конец месяца)

BM

частота окончания рабочего месяца

BH

частота рабочих часов

H

почасовая частота

T, min

поминутная частота

Давайте посмотрим, как мы можем создать диапазон дат, используя функцию Pandas date_range(), где значения делятся по полумесячной частоте. Создадим диапазон дат с 1 июля 2023 г. по 31 сентября 2023 г.:

# Create a Date Range in Pandas with a Custom Frequency
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-08-31', freq='SM')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-15', '2023-07-31', '2023-08-15', '2023-08-31'], dtype='datetime64[ns]', freq='SM-15')

В указанном выше блоке кода мы установили начальную и конечную даты с 1 июля 2023 года по 31 сентября 2023 года. Мы использовали частоту дважды в месяц, которая выбирает 15-е число месяца и последний день месяца. Из-за этого 1 июля игнорируется. Более подробную информацию о пользовательских строках частоты можно найти в официальной документации

Использование кратного пользовательской частоты в Pandas date_range

Мы можем пойти еще дальше, указав кратность пользовательской частоты. Например, если мы хотим создать диапазон дат, который пропускает каждый второй день, мы можем использовать freq='2D'. Давайте посмотрим, как мы можем воспроизвести наш предыдущий пример с этой частотой:

# Create a Custom Date Range in Pandas
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-07', freq='2D')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-01', '2023-07-03', '2023-07-05', '2023-07-07'], dtype='datetime64[ns]', freq='2D')

В указанном выше блоке кода мы использовали частоту '2D', что обозначает двухдневный интервал. Это означает, что мы начинаем с первого указанного дня, затем генерируем каждый второй день до окончания. Этот процесс гораздо проще, чем добавление дат к дате в Pandas

Создание диапазонов дат с определенными периодами

До сих пор мы рассматривали использование начальных и конечных дат при создании диапазона дат. Это означает, что Pandas определяет, сколько значений включить. Мы также можем указать количество значений, которые нужно сгенерировать, используя параметр periods=

Давайте посмотрим, как мы можем создать диапазон дат, который будет содержать пять значений между 1 и 20 июля 2023 года:

# Create a Custom Date Range with Specific Periods
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-20', periods=5)
print(dates)

# Returns:
# DatetimeIndex(['2023-07-01 00:00:00', '2023-07-05 18:00:00',
#                '2023-07-10 12:00:00', '2023-07-15 06:00:00',
#                '2023-07-20 00:00:00'],
            #   dtype='datetime64[ns]', freq=None)

В приведенном выше блоке кода мы указали три параметра: start, end и periods. Поскольку мы не указали параметр freq=, Pandas самостоятельно решает, какую частоту использовать!

Аналогично, мы можем не указывать конец диапазона дат, что позволяет нам определять периоды и частоту. Давайте рассмотрим это в следующем разделе.

Создание диапазонов дат с определенными периодами и периодичностью

Функция date_range() библиотеки Pandas требует указания трех из четырех параметров: start=, end=, periods=, и freq=. Это позволяет опустить параметр end=, тем самым задать начальное значение, частоту и количество периодов.

Давайте посмотрим, как это может выглядеть:

# Create a Custom Date Range with Specific Periods and Frequencies
import pandas as pd
dates = pd.date_range('2023-07-01', freq='B', periods=5)
print(dates)

# Returns:
# DatetimeIndex(['2023-07-03', '2023-07-04', '2023-07-05', '2023-07-06',
#                '2023-07-07'],
#               dtype='datetime64[ns]', freq='B')

В указанном выше блоке кода мы указали, что хотим создать диапазон дат, содержащий только рабочие дни, начиная с 1 июля 2023 года на протяжении пяти периодов. Поскольку 1 июля 2023 года выпадает на субботу, диапазон на самом деле начинается с 3 июля 2023 года.

Изменение границ диапазона дат Pandas

По умолчанию функция date_range в Pandas будет включать в себя как начальную, так и конечную даты диапазона. Это связано с тем, что в Pandas используется параметр inclusive='both'. Мы можем передать следующие параметры, чтобы изменить это поведение:

  • “both”, который включает оба значения

  • “neither”, что исключает оба значения

  • “left”, который включает только левое значение

  • “right”, который включает только правильное значение

Давайте посмотрим, как мы можем опустить оба значения, повторив наш первый пример:

# Modifying Edge Behavior in a Pandas Date Range
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-07', inclusive='neither')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-02', '2023-07-03', '2023-07-04', '2023-07-05',
#                '2023-07-06'],
#               dtype='datetime64[ns]', freq='D')

В приведенном выше примере мы использовали ежедневную частоту с 1 по 7 июля 2023 года. Однако мы изменили параметр inclusive= так, чтобы оба конца диапазона были исключены. Из-за этого начальное и конечное значения были исключены.

Включение часовых поясов при создании диапазона дат Pandas

По умолчанию, значения в диапазоне дат Pandas не содержат информации о часовом поясе, что означает отсутствие данных о часовом поясе. Мы можем указать конкретный часовой пояс, используя имя желаемого часового пояса. Например, давайте укажем часовой пояс восточного побережья США, передав 'US/Eastern' в качестве часового пояса.

Чтобы указать часовой пояс, используйте параметр tz=. Давайте посмотрим, как это выглядит ниже:

# Create a Date Range in Pandas with Timezones
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-07', tz='US/Eastern')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-01 00:00:00-04:00', '2023-07-02 00:00:00-04:00',
#                '2023-07-03 00:00:00-04:00', '2023-07-04 00:00:00-04:00',
#                '2023-07-05 00:00:00-04:00', '2023-07-06 00:00:00-04:00',
#                '2023-07-07 00:00:00-04:00'],
#               dtype='datetime64[ns, US/Eastern]', freq='D')

Видно, что значения в результирующем диапазоне дат теперь включают информацию о часовом поясе, специфическую для часового пояса США/Восточный.

Изменение имени индекса диапазона дат Pandas

В этом последнем разделе мы рассмотрим, как изменить имя результирующего индекса. Поскольку функция date_range() в Pandas возвращает объект в стиле индекса, это изменит структуру данных. Давайте посмотрим, как мы можем указать имя индекса, используя параметр name=

# Create a Date Range in Pandas with an Index Name
import pandas as pd
dates = pd.date_range('2023-07-01', '2023-07-07', name='Date')
print(dates)

# Returns:
# DatetimeIndex(['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04',
#                '2023-07-05', '2023-07-06', '2023-07-07'],
#               dtype='datetime64[ns]', name='Date', freq='D')

В приведенном выше примере мы видим, что атрибут name= теперь также включен в диапазон дат. Когда мы создаем DataFrame с этим, эта метка также применяется к индексу. Давайте посмотрим, как это выглядит:

# Create a DateFrame in Pandas with an Index Name
import pandas as pd
df = pd.DataFrame(range(7), columns=['Num'], index=pd.date_range('2023-07-01', '2023-07-07', name='Date'))
print(df)

# Returns:
#             Num
# Date           
# 2023-07-01    0
# 2023-07-02    1
# 2023-07-03    2
# 2023-07-04    3
# 2023-07-05    4
# 2023-07-06    5
# 2023-07-07    6

В приведенном выше DataFrame видно, что индекс теперь имеет название, 'Date'

Заключение: создание диапазонов дат с помощью Pandas

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

Вы можете узнать больше о функции, посетив официальную документацию.

Last updated