解析與操作日期

使用 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 進行資料轉換

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 進行資料轉換

擷取日期時間元件

時間序列資料表

使用 Polars 進行資料轉換

擷取日期時間元件

時間序列表格,某列的日期被標示

使用 Polars 進行資料轉換

擷取日期時間元件

時間序列表格,某列的時間被標示

使用 Polars 進行資料轉換

擷取日期時間元件

時間序列表格,某列的小時被標示

使用 Polars 進行資料轉換

擷取日期(date)

prices.with_columns(
    pl.col("time").dt.date()
)
使用 Polars 進行資料轉換

擷取日期(date)

prices.with_columns(
    pl.col("time").dt.date().alias("date")
)
使用 Polars 進行資料轉換

擷取日期(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 |
使用 Polars 進行資料轉換

擷取時間(time)

prices.with_columns(
    pl.col("time").dt.time().alias("time_of_day")
)
使用 Polars 進行資料轉換

擷取時間(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    |
使用 Polars 進行資料轉換

擷取小時(hour)

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
使用 Polars 進行資料轉換

擷取小時(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   |
使用 Polars 進行資料轉換

其他日期時間元件

  • .dt.year()-取年份
  • .dt.month()-取月份(1-12)
  • .dt.day()-取日期(當月第幾天)
  • .dt.minute()-取分鐘
1 https://docs.pola.rs/api/python/dev/reference/expressions/temporal.html
使用 Polars 進行資料轉換

調整日期時間

  • .dt.offset_by()-調整日期時間
  • "1h"-往後 1 小時
  • "-2d"-往前 2 天
使用 Polars 進行資料轉換

調整日期時間

  • .dt.offset_by()-調整日期時間
  • "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...