你不能replaceUTC 时间序列中的时区与具有 DST 转换的时区 - 您最终会得到不存在和/或丢失的日期时间。该错误可能会提供更多信息,但我不认为这特定于极地。
这是一个例子。 “美国/纽约”有一个3 月 13 日夏令时过渡 https://www.timeanddate.com/time/change/usa/new-york?year=2022. 2 am
那天不存在......所以这工作正常:
import polars as pl
from datetime import date
df = pl.DataFrame(
pl.date_range(
low=date(2022, 3, 11),
high=date(2022, 3, 13),
interval="5m",
time_unit="ns",
time_zone="UTC",
).alias("UTC")
)
print(
df.select(
pl.col("UTC").dt.replace_time_zone(time_zone="America/New_York").alias("US")
)
)
# shape: (289, 1)
# ┌────────────────────────────────┐
# │ US │
# │ --- │
# │ datetime[ns, America/New_York] │
# ╞════════════════════════════════╡
# │ 2022-03-11 00:00:00 EST │
# │ 2022-03-11 00:05:00 EST │
# │ 2022-03-11 00:10:00 EST │
# │ 2022-03-11 00:15:00 EST │
# │ … │
虽然这没有:
df = pl.DataFrame(
pl.date_range(
low=date(2022, 3, 13),
high=date(2022, 3, 15),
interval="5m",
time_unit="ns",
time_zone="UTC",
).alias("UTC")
)
print(
df.select(
pl.col("UTC").dt.replace_time_zone(time_zone="America/New_York").alias("US")
)
)
# PanicException: No such local time
解决方法您可以使用将 UTC 转换为所需的时区,然后添加其 UTC 偏移量。前任:
df = pl.DataFrame(
pl.date_range(
low=date(2022, 1, 3),
high=date(2022, 9, 30),
interval="5m",
time_unit="ns",
time_zone="UTC",
).alias("UTC")
)
df = df.with_columns(
pl.col("UTC").dt.convert_time_zone(time_zone="America/New_York").alias("US")
)
df = df.with_columns(
(pl.col("US")+(pl.col("UTC")-pl.col("US").dt.replace_time_zone(time_zone="UTC")))
.alias("US_fakeUTC")
)
print(df.select(pl.col("US_fakeUTC")))
# shape: (77761, 1)
# ┌────────────────────────────────┐
# │ US_fakeUTC │
# │ --- │
# │ datetime[ns, America/New_York] │
# ╞════════════════════════════════╡
# │ 2022-01-03 00:00:00 EST │
# │ 2022-01-03 00:05:00 EST │
# │ 2022-01-03 00:10:00 EST │
# │ 2022-01-03 00:15:00 EST │
# │ … │