Дата и время в Pandas
Pandas предоставляет мощные возможности обработки даты и времени, позволяя легко преобразовывать строки в типы дат и выполнять различные вычисления и анализ, связанные с датами.
Создание даты и времени
Функция date_range
Пример
# Создать диапазон дат
dates = pd.date_range("2024-01-01", periods=10, freq="D")
print("По дням:")
print(dates)
print()
# По месяцам
dates_month = pd.date_range("2024-01-01", periods=12, freq="M")
print("По месяцам:")
print(dates_month)
print()
# По часам
dates_hour = pd.date_range("2024-01-01 00:00", periods=24, freq="H")
print("По часам (первые 5):")
print(dates_hour[:5])
DatetimeIndex и DatetimeArray
Пример
import numpy as np
# Создание с помощью объекта datetime
dt = pd.DatetimeIndex([
pd.Timestamp("2024-01-01"),
pd.Timestamp("2024-01-02"),
pd.Timestamp("2024-01-03")
])
print("DatetimeIndex:")
print(dt)
print()
# Создание Series с временем
s = pd.Series(
[100, 200, 300],
index=pd.date_range("2024-01-01", periods=3, freq="D")
)
print("Series с индексом даты:")
print(s)
Преобразование строк в даты
pd.to_datetime
Пример
# Преобразование строк в различных форматах в даты
dates_str = ["2024-01-01", "2024/01/02", "01-03-2024", "20240104"]
# Автоматически определить формат
dt = pd.to_datetime(dates_str)
print("Автоматически определённый формат:")
print(dt)
print()
# Указать формат
dt2 = pd.to_datetime(dates_str, format="%Y-%m-%d")
print("Указанный формат:")
print(dt2)
print()
# Обработать недопустимые значения
dt3 = pd.to_datetime(["2024-01-01", "invalid", "2024-01-03"], errors="coerce")
print("Обработка недопустимых значений (преобразованы в NaT):")
print(dt3)
read_csv Автоматическое распознавание дат
Пример
from io import StringIO
# Имитация данных CSV
csv_data = """Date,Sales
2024-01-01,100
2024-01-02,200
2024-01-03,150
"""
# Способ 1: Преобразование после чтения
df = pd.read_csv(StringIO(csv_data))
df["Date"] = pd.to_datetime(df["Date"])
print("После чтения, преобразовать:")
print(df.dtypes)
print()
# Способ 2: Разбор непосредственно при чтении
df2 = pd.read_csv(StringIO(csv_data), parse_dates=["Date"])
print("Разбор при чтении:")
print(df2.dtypes)
Доступ к атрибутам даты
После преобразования даты и времени в тип datetime можно легко извлечь различные атрибуты.
Пример
# Создание Series дат
s = pd.Series(pd.date_range("2024-01-15", periods=5, freq="D"))
print("Series дат:")
print(s)
print()
# Извлечение года/месяца/дня
print("Извлечение года:")
print(s.dt.year)
print()
print("Извлечение месяца:")
print(s.dt.month)
print()
print("Извлечь день:")
print(s.dt.day)
print()
# Извлечь день недели (0=понедельник, 6=воскресенье)
print("День недели (число):")
print(s.dt.dayofweek)
print()
# Извлечь название дня недели
print("Название дня недели:")
print(s.dt.day_name())
Дополнительные атрибуты даты
| Attribute | Описание | Пример |
|---|---|---|
year |
год | 2024 |
month |
Месяц (1-12) | 1 |
day |
День (1-31) | 15 |
hour |
Час (0-23) | 10 |
minute |
Минута (0-59) | 30 |
dayofweek |
День недели (0-6) | 0 |
quarter |
Квартал (1-4) | 1 |
is_month_start |
Является началом месяца | True/False |
is_month_end |
Является концом месяца | True/False |
Операции с датой
Сложение и вычитание дат
Пример
# Создать дату
date = pd.Timestamp("2024-01-15")
print(f"Базовая дата: {date}")
print()
# Добавить/вычесть дни
print(f"+3 дня: {date + pd.Timedelta(days=3)}")
print(f"-5 дней: {date - pd.Timedelta(days=5)}")
print()
# Разница дат
date1 = pd.Timestamp("2024-01-01")
date2 = pd.Timestamp("2024-01-15")
print(f"Разница дат: {date2 - date1}")
print(f"Разница в днях: {(date2 - date1).days}")
print()
# Операции с Series дат
dates = pd.date_range("2024-01-01", periods=5, freq="D")
print("Дата + 3 дня:")
print(dates + pd.Timedelta(days=3))
Смещения дат
Пример
date = pd.Timestamp("2024-01-15")
print(f"Базовая дата: {date}")
print()
# Начало/Конец месяца
print(f"Начало месяца: {date + pd.offsets.MonthBegin(1)}")
print(f"Конец месяца: {date + pd.offsets.MonthEnd(1)}")
print()
# Смещение года
print(f"Добавить 1 год: {date + pd.DateOffset(years=1)}")
print(f"Вычесть 1 месяц: {date + pd.DateOffset(months=-1)}")
print()
# День недели
print(f"Следующий понедельник: {date + pd.offsets.Week(weekday=0)}")
Обработка часовых поясов
Пример
# Создать время без часового пояса
dates = pd.date_range("2024-01-01 10:00", periods=3, freq="H")
print("Без часового пояса:")
print(dates)
print()
# Установить часовой пояс
dates_utc = dates.tz_localize("UTC")
print("Установить часовой пояс UTC:")
print(dates_utc)
print()
# Преобразовать часовой пояс
dates_shanghai = dates_utc.tz_convert("Asia/Shanghai")
print("Преобразовать в часовой пояс Шанхая:")
print(dates_shanghai)
Практика: анализ данных о продажах
Пример
# Смоделировать данные о продажах
df = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Sales": [100, 150, 120, 180, 200, 90, 80] * 4 + [100, 100]
})
df["Date"] = pd.to_datetime(df["Date"])
print("Данные о продажах:")
print(df.head(10))
print()
# Статистика по дням недели
print("Средние продажи по дням недели:")
weekday_sales = df.groupby(df["Date"].dt.day_name())["Sales"].mean()
print(weekday_sales)
print()
# Статистика по месяцам
print("По месяцам:")
df["Month"] = df["Date"].dt.to_period("M")
monthly_sales = df.groupby("Month")["Sales"].sum()
print(monthly_sales)
print()
# Вычислить 7-дневное скользящее среднее
df["7-day rolling average"] = df["Sales"].rolling(window=7).mean()
print("Добавить 7-дневное скользящее среднее:")
print(df.head(10))
ЧАВО
1. Несогласованные форматы даты
При использованииpd.to_datetimeможно указатьformatпараметр для уточнения формата, позволяющий избежать ошибок парсинга.
2. Путаница с часовыми поясами
При обработке данных в разных часовых поясах убедитесь, что все временные метки используют единый часовой пояс или время UTC.
3. Операции с датами используют Timedelta
Для сложения и вычитания дат используетсяpd.Timedelta, а не целочисленное сложение и вычитание.
Другие расширенияПри обработке данных временных рядов рекомендуется как можно раньше преобразовывать строки с датами в тип datetime, чтобы использовать мощные возможности Pandas для работы с датами.