Phân tích và xử lý ngày giờ

Biến đổi dữ liệu với Polars

Liam Brannigan

Data Scientist & Polars Contributor

Dữ liệu chuỗi thời gian

Chuỗi thời gian giá thị trường

Biến đổi dữ liệu với Polars

Dữ liệu chuỗi thời gian

Chuỗi thời gian doanh số

Biến đổi dữ liệu với Polars

Dữ liệu chuỗi thời gian

Chuỗi thời gian lượt xem

Biến đổi dữ liệu với Polars

Dữ liệu chuỗi thời gian

Chuỗi thời gian số đếm

Biến đổi dữ liệu với Polars

Bộ dữ liệu giá điện

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 - giá trị theo giờ
  • price - £ trên megawatt-giờ
  • solar - W trên mét vuông
  • solar > 400 = ngày hè ấm
Biến đổi dữ liệu với Polars

Quan hệ giữa giá và năng lượng mặt trời

Chuỗi thời gian giá điện

Biến đổi dữ liệu với Polars

Quan hệ giữa giá và năng lượng mặt trời

Chuỗi thời gian giá điện

Biến đổi dữ liệu với Polars

Kiểu dữ liệu thời gian trong Polars

  • Date - ngày dương lịch - 2000-01-01
  • Datetime - ngày và giờ - 2000-01-01 12:00:00
  • Time - thời gian trong ngày - 12:00:00
  • Duration - khoảng thời gian - 3 hours
Biến đổi dữ liệu với Polars

Tự động phân tích datetime

pl.read_csv(
  "electricity_prices",

)
Biến đổi dữ liệu với Polars

Tự động phân tích datetime

pl.read_csv(
  "electricity_prices",
  try_parse_dates=True
)
  • định dạng: YYYY-MM-DD
  • ví dụ: 2025-07-05
  • ví dụ: 2025-07-05 12:00:00
Biến đổi dữ liệu với Polars

Dữ liệu cần phân tích thủ công

| time             | price | solar |
| ---              | ---   | ---   |
| str              | f64   | f64   |
|------------------|-------|-------|
| 05/07/2025 00:00 | 34.2  | 0.0   |
| 05/07/2025 01:00 | 28.7  | 0.0   |
  • định dạng: DD/MM/YYYY HH:MM
  • Polars không tự nhận diện
Biến đổi dữ liệu với Polars

Phân tích với strptime

prices.with_columns(
    pl.col("time").str.strptime(                             )
)
Biến đổi dữ liệu với Polars

Phân tích với strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime,                 )
)
Biến đổi dữ liệu với Polars

Phân tích với strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y      ")
)
Biến đổi dữ liệu với Polars

Phân tích với strptime

prices.with_columns(
    pl.col("time").str.strptime(pl.Datetime, "%d/%m/%Y %H:%M")
)
Biến đổi dữ liệu với Polars

Phân tích với 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   |
Biến đổi dữ liệu với Polars

Tách thành phần datetime

Bảng dữ liệu chuỗi thời gian

Biến đổi dữ liệu với Polars

Tách thành phần datetime

Bảng dữ liệu chuỗi thời gian với ngày được tô sáng trên một hàng

Biến đổi dữ liệu với Polars

Tách thành phần datetime

Bảng dữ liệu chuỗi thời gian với giờ được tô sáng trên một hàng

Biến đổi dữ liệu với Polars

Tách thành phần datetime

Bảng dữ liệu chuỗi thời gian với giờ trong ngày được tô sáng trên một hàng

Biến đổi dữ liệu với Polars

Tách ngày (date)

prices.with_columns(
    pl.col("time").dt.date()
)
Biến đổi dữ liệu với Polars

Tách ngày (date)

prices.with_columns(
    pl.col("time").dt.date().alias("date")
)
Biến đổi dữ liệu với Polars

Tách ngày (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 |
Biến đổi dữ liệu với Polars

Tách thời gian (time)

prices.with_columns(
    pl.col("time").dt.time().alias("time_of_day")
)
Biến đổi dữ liệu với Polars

Tách thời gian (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    |
Biến đổi dữ liệu với Polars

Tách giờ (hour)

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
Biến đổi dữ liệu với Polars

Tách giờ (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   |
Biến đổi dữ liệu với Polars

Các thành phần datetime khác

  • .dt.year() - trích xuất năm
  • .dt.month() - trích xuất tháng (1-12)
  • .dt.day() - trích xuất ngày trong tháng
  • .dt.minute() - trích xuất phút
  • ...
1 https://docs.pola.rs/api/python/dev/reference/expressions/temporal.html
Biến đổi dữ liệu với Polars

Điều chỉnh datetime

  • .dt.offset_by() - điều chỉnh datetime
  • "1h" - tiến 1 giờ
  • "-2d" - lùi 2 ngày
Biến đổi dữ liệu với Polars

Điều chỉnh datetime

  • .dt.offset_by() - điều chỉnh datetime
  • "1h" - tiến 1 giờ
  • "-2d" - lùi 2 ngày
1 https://docs.pola.rs/api/python/stable/reference/expressions/api/polars.Expr.dt.offset_by.html
Biến đổi dữ liệu với Polars

Thêm thời điểm kết thúc cửa sổ thời gian

prices.with_columns(
    pl.col("time").dt.offset_by("1h")
)
Biến đổi dữ liệu với Polars

Thêm thời điểm kết thúc cửa sổ thời gian

prices.with_columns(
    pl.col("time").dt.offset_by("1h").alias("time_end")
)
Biến đổi dữ liệu với Polars

Thêm thời điểm kết thúc cửa sổ thời gian

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 |
Biến đổi dữ liệu với Polars

Ayo berlatih!

Biến đổi dữ liệu với Polars

Preparing Video For Download...