Skip to content

时区

汤姆·斯科特

如果可能的话,你真的应该永远不要处理时区。

Datetime 数据类型可以关联一个时区。有效的时区示例如下:

  • None: 没有时区,也称为“时区无知”。
  • UTC: 协调世界时。
  • Asia/Kathmandu: 以“区域/位置”格式表示的时区。请参阅 tz数据库时区列表以 查看可用的时区。

注意:不应使用固定偏移量(如+02:00)来处理时区。建议使用上述提到的“区域/位置”格式,因为它可以更有效地管理时区。

请注意,由于Datetime只能有一个时区,因此不可能有一个包含多个时区的列。如果您正在解析具有多个偏移量的数据,您可能希望传递utc=True以将它们全部转换为一个共同的时区(UTC),请参阅解析日期和时间

设置和转换时区的主要方法是:

  • dt.convert_time_zone: 从一个时区转换到另一个时区。
  • dt.replace_time_zone: 设置/取消/更改时区。

让我们看一些常见操作的示例:

str.to_datetime · dt.replace_time_zone · 时区功能可用

ts = ["2021-03-27 03:00", "2021-03-28 03:00"]
tz_naive = pl.Series("tz_naive", ts).str.to_datetime()
tz_aware = tz_naive.dt.replace_time_zone("UTC").rename("tz_aware")
time_zones_df = pl.DataFrame([tz_naive, tz_aware])
print(time_zones_df)

str.replace_all · dt.replace_time_zone · 在功能 dtype-datetime 上可用 · 在功能 timezones 上可用

let ts = ["2021-03-27 03:00", "2021-03-28 03:00"];
let tz_naive = Column::new("tz_naive".into(), &ts);
let time_zones_df = DataFrame::new(vec![tz_naive])?
    .lazy()
    .select([col("tz_naive").str().to_datetime(
        Some(TimeUnit::Milliseconds),
        None,
        StrptimeOptions::default(),
        lit("raise"),
    )])
    .with_columns([col("tz_naive")
        .dt()
        .replace_time_zone(Some("UTC".into()), lit("raise"), NonExistent::Raise)
        .alias("tz_aware")])
    .collect()?;

println!("{}", &time_zones_df);

shape: (2, 2)
┌─────────────────────┬─────────────────────────┐
│ tz_naive            ┆ tz_aware                │
│ ---                 ┆ ---                     │
│ datetime[μs]        ┆ datetime[μs, UTC]       │
╞═════════════════════╪═════════════════════════╡
│ 2021-03-27 03:00:00 ┆ 2021-03-27 03:00:00 UTC │
│ 2021-03-28 03:00:00 ┆ 2021-03-28 03:00:00 UTC │
└─────────────────────┴─────────────────────────┘

dt.convert_time_zone · dt.replace_time_zone · 时区功能可用

time_zones_operations = time_zones_df.select(
    [
        pl.col("tz_aware")
        .dt.replace_time_zone("Europe/Brussels")
        .alias("replace time zone"),
        pl.col("tz_aware")
        .dt.convert_time_zone("Asia/Kathmandu")
        .alias("convert time zone"),
        pl.col("tz_aware").dt.replace_time_zone(None).alias("unset time zone"),
    ]
)
print(time_zones_operations)

dt.convert_time_zone · dt.replace_time_zone · 在时区功能上可用

let time_zones_operations = time_zones_df
    .lazy()
    .select([
        col("tz_aware")
            .dt()
            .replace_time_zone(
                Some("Europe/Brussels".into()),
                lit("raise"),
                NonExistent::Raise,
            )
            .alias("replace time zone"),
        col("tz_aware")
            .dt()
            .convert_time_zone("Asia/Kathmandu".into())
            .alias("convert time zone"),
        col("tz_aware")
            .dt()
            .replace_time_zone(None, lit("raise"), NonExistent::Raise)
            .alias("unset time zone"),
    ])
    .collect()?;
println!("{}", &time_zones_operations);

shape: (2, 3)
┌───────────────────────────────┬──────────────────────────────┬─────────────────────┐
│ replace time zone             ┆ convert time zone            ┆ unset time zone     │
│ ---                           ┆ ---                          ┆ ---                 │
│ datetime[μs, Europe/Brussels] ┆ datetime[μs, Asia/Kathmandu] ┆ datetime[μs]        │
╞═══════════════════════════════╪══════════════════════════════╪═════════════════════╡
│ 2021-03-27 03:00:00 CET       ┆ 2021-03-27 08:45:00 +0545    ┆ 2021-03-27 03:00:00 │
│ 2021-03-28 03:00:00 CEST      ┆ 2021-03-28 08:45:00 +0545    ┆ 2021-03-28 03:00:00 │
└───────────────────────────────┴──────────────────────────────┴─────────────────────┘