时区
Tom Scott
如果可以的话,你真的永远不应该处理时区。
`Datetime` 数据类型可以关联一个时区。有效的时区示例有:
- `None`:无时区,也称为“时区不敏感(time zone naive)”。
- `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
· 在 feature timezone 上可用
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
· 在 feature timezones 上可用 · 在 feature dtype-datetime 上可用
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(TimeZone::UTC), 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
· 在 feature timezone 上可用
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
· 在 feature timezones 上可用
let time_zones_operations = time_zones_df
.lazy()
.select([
col("tz_aware")
.dt()
.replace_time_zone(
TimeZone::opt_try_new(Some("Europe/Brussels")).unwrap(),
lit("raise"),
NonExistent::Raise,
)
.alias("replace time zone"),
col("tz_aware")
.dt()
.convert_time_zone(
TimeZone::opt_try_new(Some("Asia/Kathmandu"))
.unwrap()
.unwrap(),
)
.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 │
└───────────────────────────────┴──────────────────────────────┴─────────────────────┘