Filtering and aggregating by time period

Data Transformation with Polars

Liam Brannigan

Data Scientist & Polars Contributor

Finding specific prices

Table of time series data

Data Transformation with Polars

Finding specific prices

Table of time series data with 1 row highlighted

Data Transformation with Polars

Finding specific prices

Table of time series data with 3 rows highlighted

Data Transformation with Polars

Filtering with pl.datetime

prices.filter(

)

$$

$$

$$

$$

  • Task: find the prices at noon on July 5th
Data Transformation with Polars

Filtering with pl.datetime

prices.filter(
    pl.col("time") == 
)
Data Transformation with Polars

Filtering with pl.datetime

prices.filter(
    pl.col("time") == pl.datetime(                                  )
)
Data Transformation with Polars

Filtering with pl.datetime

prices.filter(
    pl.col("time") == pl.datetime(year=2025, month=7, day=5, hour=12)
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 12:00:00 | 0.0   | 462.0 |
Data Transformation with Polars

Filtering by date with pl.date

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

Filtering by date with pl.date

prices.filter(
    pl.col("time").dt.date() == pl.date(year=2025, month=7, day=5)
)
Data Transformation with Polars

Filtering by date with pl.date

prices.filter(
    pl.col("time").dt.date() == pl.date(year=2025, month=7, day=5)
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | 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 23:00:00 | 72.3  | 0.0   |
Data Transformation with Polars

Filtering a datetime range

prices.filter(
    pl.col("time").is_between(


    )
)
Data Transformation with Polars

Filtering a datetime range

prices.filter(
    pl.col("time").is_between(
        pl.datetime(2025, 7, 5, 8),
        pl.datetime(2025, 7, 5, 18)
    )
)
Data Transformation with Polars

Filtering a datetime range

prices.filter(
    pl.col("time").is_between(
        pl.datetime(2025, 7, 5, 8),
        pl.datetime(2025, 7, 5, 18)
    )
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 08:00:00 | 1.7   | 180.0 |
| 2025-07-05 09:00:00 | 1.3   | 243.0 |
| ...                 | ...   | ...   |
| 2025-07-05 17:00:00 | 77.8  | 153.0 |
| 2025-07-05 18:00:00 | 87.3  | 119.0 |
Data Transformation with Polars

Aggregating by time period

Rows to aggregate into time windows

  • Aggregate data with .group_by_dynamic()
Data Transformation with Polars

Aggregating by time period

prices.sort("time")


Data Transformation with Polars

Aggregating by time period

prices.sort("time").group_by_dynamic("time",          )


Data Transformation with Polars

Aggregating by time period

prices.sort("time").group_by_dynamic("time", every="6h")


Data Transformation with Polars

Aggregating by 6-hour windows

prices.sort("time").group_by_dynamic("time", every="6h").agg(

)
Data Transformation with Polars

Aggregating by 6-hour windows

prices.sort("time").group_by_dynamic("time", every="6h").agg(
    pl.col("price").mean().alias("avg_price")
)
Data Transformation with Polars

Aggregating by 6-hour windows

prices.sort("time").group_by_dynamic("time", every="6h").agg(
    pl.col("price").mean().alias("avg_price")
)
| time                | avg_price |
| ---                 | ---       |
| datetime[µs]        | f64       |
|---------------------|-----------|
| 2025-07-05 00:00:00 | 28.4      |
| 2025-07-05 06:00:00 | 15.2      |
| 2025-07-05 12:00:00 | 42.1      |
| 2025-07-05 18:00:00 | 68.7      |
Data Transformation with Polars

Aggregating by day

prices.sort("time").group_by_dynamic("time", every="1d").agg(

pl.col("price").mean().alias("avg_price"), pl.col("solar").mean().alias("avg_solar")
)
Data Transformation with Polars

Aggregating by day

prices.sort("time").group_by_dynamic("time", every="1d").agg(
    pl.col("price").mean().alias("avg_price"),
    pl.col("solar").mean().alias("avg_solar")
)
| time                | avg_price | avg_solar |
| ---                 | ---       | ---       |
| datetime[µs]        | f64       | f64       |
|---------------------|-----------|-----------|
| 2025-07-05 00:00:00 | 36.7      | 147.1     |
| 2025-07-06 00:00:00 | 42.1      | 133.8     |
Data Transformation with Polars

Controlling window size

  • every - how often a new window starts
  • period - the length of each window
  • By default, period equals every
Data Transformation with Polars

Controlling window size

prices.group_by_dynamic("time", every="2h")
Data Transformation with Polars

Controlling window size

Non-overlapping 2-hour windows

Data Transformation with Polars

Controlling window size

prices.group_by_dynamic("time", every="1h", period="2h")
Data Transformation with Polars

Controlling window size

First overlapping window starting at 10

Data Transformation with Polars

Controlling window size

Second overlapping window starting at 11

Data Transformation with Polars

Let's practice!

Data Transformation with Polars

Preparing Video For Download...