Data Transformation with Polars
Liam Brannigan
Data Scientist & Polars Contributor



prices.filter(
)
$$
$$
$$
$$
prices.filter(
pl.col("time") ==
)
prices.filter(
pl.col("time") == 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 |
prices.filter(
pl.col("time").dt.date() ==
)
prices.filter(
pl.col("time").dt.date() == pl.date(year=2025, month=7, day=5)
)
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 |
prices.filter(
pl.col("time").is_between(
)
)
prices.filter(
pl.col("time").is_between(
pl.datetime(2025, 7, 5, 8),
pl.datetime(2025, 7, 5, 18)
)
)
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 |

.group_by_dynamic()prices.sort("time")
prices.sort("time").group_by_dynamic("time", )
prices.sort("time").group_by_dynamic("time", every="6h")
prices.sort("time").group_by_dynamic("time", every="6h").agg(
)
prices.sort("time").group_by_dynamic("time", every="6h").agg(
pl.col("price").mean().alias("avg_price")
)
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 |
prices.sort("time").group_by_dynamic("time", every="1d").agg(pl.col("price").mean().alias("avg_price"), pl.col("solar").mean().alias("avg_solar"))
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 |
every - how often a new window startsperiod - the length of each windowperiod equals everyprices.group_by_dynamic("time", every="2h")

prices.group_by_dynamic("time", every="1h", period="2h")


Data Transformation with Polars