Parsing and manipulating dates

Data Transformation with Polars

Liam Brannigan

Data Scientist & Polars Contributor

Time series data

Time series for market prices

Data Transformation with Polars

Time series data

Time series for sales

Data Transformation with Polars

Time series data

Time series for streams

Data Transformation with Polars

Time series data

Time series for count

Data Transformation with Polars

Electricity prices dataset

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 - hourly values
  • price - £ per Megawatt hour
  • solar - W per square meter
  • solar > 400 = warm summer day
Data Transformation with Polars

Price and solar relationship

Time series of electricity prices

Data Transformation with Polars

Price and solar relationship

Time series of electricity prices

Data Transformation with Polars

Datetime dtypes in Polars

  • Date - calendar date - 2000-01-01
  • Datetime - date and time - 2000-01-01 12:00:00
  • Time - time of day - 12:00:00
  • Duration - time span - 3 hours
Data Transformation with Polars

Automatic datetime parsing

pl.read_csv(
  "electricity_prices",

)
Data Transformation with Polars

Automatic datetime parsing

pl.read_csv(
  "electricity_prices",
  try_parse_dates=True
)
  • format: YYYY-MM-DD
  • e.g. 2025-07-05
  • e.g. 2025-07-05 12:00:00
Data Transformation with Polars

Our data needs manual parsing

| time             | price | solar |
| ---              | ---   | ---   |
| str              | f64   | f64   |
|------------------|-------|-------|
| 05/07/2025 00:00 | 34.2  | 0.0   |
| 05/07/2025 01:00 | 28.7  | 0.0   |
  • format: DD/MM/YYYY HH:MM
  • not auto-detected by Polars
Data Transformation with Polars

Parsing with strptime

prices.with_columns(
    pl.col("time").str.strptime(                             )
)
Data Transformation with Polars

Parsing with strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime,                 )
)
Data Transformation with Polars

Parsing with strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y      ")
)
Data Transformation with Polars

Parsing with strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y %H:%M")
)
Data Transformation with Polars

Parsing with 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   |
Data Transformation with Polars

Extracting datetime components

Table of time series data

Data Transformation with Polars

Extracting datetime components

Table of time series data with the date highlighted on one row

Data Transformation with Polars

Extracting datetime components

Table of time series data with the time highlighted on one row

Data Transformation with Polars

Extracting datetime components

Table of time series data with the hour highlighted on one row

Data Transformation with Polars

Extracting the date

prices.with_columns(
    pl.col("time").dt.date()
)
Data Transformation with Polars

Extracting the date

prices.with_columns(
    pl.col("time").dt.date().alias("date")
)
Data Transformation with Polars

Extracting the date

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 |
Data Transformation with Polars

Extracting the time

prices.with_columns(
    pl.col("time").dt.time().alias("time_of_day")
)
Data Transformation with Polars

Extracting the time

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    |
Data Transformation with Polars

Extracting the hour

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
Data Transformation with Polars

Extracting the hour

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   |
Data Transformation with Polars

Other datetime components

  • .dt.year() - extract the year
  • .dt.month() - extract the month (1-12)
  • .dt.day() - extract the day of month
  • .dt.minute() - extract the minute
  • ...
1 https://docs.pola.rs/api/python/dev/reference/expressions/temporal.html
Data Transformation with Polars

Adjusting datetimes

  • .dt.offset_by() - adjust datetimes
  • "1h" - forward 1 hour
  • "-2d" - backward 2 days
Data Transformation with Polars

Adjusting datetimes

  • .dt.offset_by() - adjust datetimes
  • "1h" - forward 1 hour
  • "-2d" - backward 2 days
1 https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.offset_by.html
Data Transformation with Polars

Adding a time window end

prices.with_columns(
    pl.col("time").dt.offset_by("1h")
)
Data Transformation with Polars

Adding a time window end

prices.with_columns(
    pl.col("time").dt.offset_by("1h").alias("time_end")
)
Data Transformation with Polars

Adding a time window end

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 |
Data Transformation with Polars

Let's practice!

Data Transformation with Polars

Preparing Video For Download...