Разбор и обработка дат

Преобразование данных с помощью Polars

Liam Brannigan

Data Scientist & Polars Contributor

Данные временных рядов

Временной ряд рыночных цен

Преобразование данных с помощью Polars

Данные временных рядов

Временной ряд продаж

Преобразование данных с помощью Polars

Данные временных рядов

Временной ряд потоков

Преобразование данных с помощью Polars

Данные временных рядов

Временной ряд количества

Преобразование данных с помощью Polars

Набор данных о ценах на электроэнергию

shape: (24, 3)
| time             | price | solar |
| ---              | ---   | ---   |
| str              | f64   | f64   |
|------------------|-------|-------|
| 05/07/2025 00:00 | 34.2  | 0.0   |
| ...              | ...   | ...   |
| 05/07/2025 12:00 | 0.0   | 462.0 |
  • time - почасовые значения
  • price - £ за мегаватт-час
  • solar - Вт на квадратный метр
  • solar > 400 = тёплый летний день
Преобразование данных с помощью Polars

Зависимость цены от солнечной генерации

Временной ряд цен на электроэнергию

Преобразование данных с помощью Polars

Зависимость цены от солнечной генерации

Временной ряд цен на электроэнергию

Преобразование данных с помощью Polars

Типы данных datetime в Polars

  • Date - календарная дата - 2000-01-01
  • Datetime - дата и время - 2000-01-01 12:00:00
  • Time - время суток - 12:00:00
  • Duration - промежуток времени - 3 hours
Преобразование данных с помощью Polars

Автоматический разбор дат

pl.read_csv(
  "electricity_prices",

)
Преобразование данных с помощью Polars

Автоматический разбор дат

pl.read_csv(
  "electricity_prices",
  try_parse_dates=True
)
  • формат: YYYY-MM-DD
  • напр. 2025-07-05
  • напр. 2025-07-05 12:00:00
Преобразование данных с помощью Polars

Данные требуют разбора вручную

| time             | price | solar |
| ---              | ---   | ---   |
| str              | f64   | f64   |
|------------------|-------|-------|
| 05/07/2025 00:00 | 34.2  | 0.0   |
| 05/07/2025 01:00 | 28.7  | 0.0   |
  • формат: DD/MM/YYYY HH:MM
  • Polars не распознаёт его автоматически
Преобразование данных с помощью Polars

Разбор с помощью strptime

prices.with_columns(
    pl.col("time").str.strptime(                             )
)
Преобразование данных с помощью Polars

Разбор с помощью strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime,                 )
)
Преобразование данных с помощью Polars

Разбор с помощью strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y      ")
)
Преобразование данных с помощью Polars

Разбор с помощью strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y %H:%M")
)
Преобразование данных с помощью Polars

Разбор с помощью strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y %H:%M")
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[us]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   |
| 2025-07-05 01:00:00 | 28.7  | 0.0   |
| 2025-07-05 02:00:00 | 27.5  | 0.0   |
Преобразование данных с помощью Polars

Извлечение компонентов datetime

Таблица данных временного ряда

Преобразование данных с помощью Polars

Извлечение компонентов datetime

Таблица данных временного ряда с выделенной датой в одной строке

Преобразование данных с помощью Polars

Извлечение компонентов datetime

Таблица данных временного ряда с выделенным временем в одной строке

Преобразование данных с помощью Polars

Извлечение компонентов datetime

Таблица данных временного ряда с выделенным часом в одной строке

Преобразование данных с помощью Polars

Извлечение даты

prices.with_columns(
    pl.col("time").dt.date()
)
Преобразование данных с помощью Polars

Извлечение даты

prices.with_columns(
    pl.col("time").dt.date().alias("date")
)
Преобразование данных с помощью Polars

Извлечение даты

prices.with_columns(
    pl.col("time").dt.date().alias("date")
)
| time                | price | solar | date       |
| ---                 | ---   | ---   | ---        |
| datetime[µs]        | f64   | f64   | date       |
|---------------------|-------|-------|------------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | 2025-07-05 |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | 2025-07-05 |
| 2025-07-05 02:00:00 | 27.5  | 0.0   | 2025-07-05 |
Преобразование данных с помощью Polars

Извлечение времени

prices.with_columns(
    pl.col("time").dt.time().alias("time_of_day")
)
Преобразование данных с помощью Polars

Извлечение времени

prices.with_columns(
    pl.col("time").dt.time().alias("time_of_day")
)
| time                | price | solar | time_of_day |
| ---                 | ---   | ---   | ---         |
| datetime[us]        | f64   | f64   | time        |
|---------------------|-------|-------|-------------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | 00:00:00    |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | 01:00:00    |
| 2025-07-05 02:00:00 | 27.5  | 0.0   | 02:00:00    |
Преобразование данных с помощью Polars

Извлечение часа

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
Преобразование данных с помощью Polars

Извлечение часа

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
| time                | price | solar | hour |
| ---                 | ---   | ---   | ---  |
| datetime[µs]        | f64   | f64   | i8   |
|---------------------|-------|-------|------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | 0    |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | 1    |
| 2025-07-05 12:00:00 | 0.0   | 462.0 | 12   |
Преобразование данных с помощью Polars

Другие компоненты datetime

  • .dt.year() - извлечь год
  • .dt.month() - извлечь месяц (1–12)
  • .dt.day() - извлечь день месяца
  • .dt.minute() - извлечь минуту
  • ...
1 https://docs.pola.rs/api/python/dev/reference/expressions/temporal.html
Преобразование данных с помощью Polars

Сдвиг значений datetime

  • .dt.offset_by() - сдвиг значений datetime
  • "1h" - вперёд на 1 час
  • "-2d" - назад на 2 дня
Преобразование данных с помощью Polars

Сдвиг значений datetime

  • .dt.offset_by() - сдвиг значений datetime
  • "1h" - вперёд на 1 час
  • "-2d" - назад на 2 дня
1 https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.offset_by.html
Преобразование данных с помощью Polars

Добавление конца временного окна

prices.with_columns(
    pl.col("time").dt.offset_by("1h")
)
Преобразование данных с помощью Polars

Добавление конца временного окна

prices.with_columns(
    pl.col("time").dt.offset_by("1h").alias("time_end")
)
Преобразование данных с помощью Polars

Добавление конца временного окна

prices.with_columns(
    pl.col("time").dt.offset_by("1h").alias("time_end")
)
| time                | price | solar | time_end            |
| ---                 | ---   | ---   | ---                 |
| datetime[µs]        | f64   | f64   | datetime[µs]        |
|---------------------|-------|-------|---------------------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | 2025-07-05 01:00:00 |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | 2025-07-05 02:00:00 |
| 2025-07-05 02:00:00 | 27.5  | 0.0   | 2025-07-05 03:00:00 |
Преобразование данных с помощью Polars

Давайте потренируемся!

Преобразование данных с помощью Polars

Preparing Video For Download...