Дата и время в Pandas

Pandas предоставляет мощные возможности обработки даты и времени, позволяя легко преобразовывать строки в типы дат и выполнять различные вычисления и анализ, связанные с датами.


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

Функция date_range

Пример

import pandas as pd

# Создать диапазон дат
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 pandas as pd
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

Пример

import pandas as pd

# Преобразование строк в различных форматах в даты
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 Автоматическое распознавание дат

Пример

import pandas as pd
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 можно легко извлечь различные атрибуты.

Пример

import pandas as pd

# Создание 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

Операции с датой

Сложение и вычитание дат

Пример

import pandas as pd

# Создать дату
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))

Смещения дат

Пример

import pandas as pd

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)}")

Обработка часовых поясов

Пример

import pandas as pd

# Создать время без часового пояса
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)

Практика: анализ данных о продажах

Пример

import pandas as pd

# Смоделировать данные о продажах
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 для работы с датами.

Другие расширения