这是我们要使用的测试数据:
import polars as pl
import pandas as pd
from datetime import date, time, datetime
df = pl.DataFrame(
pl.datetime_range(
start=date(2022, 1, 3),
end=date(2022, 9, 30),
interval="5m",
time_unit="ns",
time_zone="UTC",
eager=True
).alias("UTC")
)
我特别需要
replace_time_zone
来实际更改底层时间戳。
它适用于
convert_time_zone
:
df.select(
pl.col("UTC").dt.convert_time_zone(time_zone="America/New_York").alias("US")
)
shape: (77_761, 1)
┌────────────────────────────────┐
│ US │
│ --- │
│ datetime[ns, America/New_York] │
╞════════════════════════════════╡
│ 2022-01-02 19:00:00 EST │
│ 2022-01-02 19:05:00 EST │
│ 2022-01-02 19:10:00 EST │
│ 2022-01-02 19:15:00 EST │
│ 2022-01-02 19:20:00 EST │
│ … │
│ 2022-09-29 19:40:00 EDT │
│ 2022-09-29 19:45:00 EDT │
│ 2022-09-29 19:50:00 EDT │
│ 2022-09-29 19:55:00 EDT │
│ 2022-09-29 20:00:00 EDT │
└────────────────────────────────┘
但是失败了
replace_time_zone
:
df.select(
pl.col("UTC").dt.replace_time_zone(time_zone="America/New_York").alias("US")
)
# ComputeError: datetime '2022-03-13 02:00:00' is non-existent in time zone 'America/New_York'.
# You may be able to use `non_existent='null'` to return `null` in this case.
您无法将 UTC 时间序列中的时区替换为具有 DST 转换的时区 - 您最终会得到不存在和/或丢失的日期时间。该错误可能会提供更多信息,但我不认为这特定于极坐标。 这是一个例子。 “America/New_York”于 3 月 13 日进行了
DST 转换。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
您可以使用的解决方法
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 │
# │ … │
import polars as pl
import pandas as pd
from datetime import date, time, datetime
df = pl.DataFrame(
pl.datetime_range(
start=date(2022, 1, 3),
end=date(2022, 9, 30),
interval="5m",
time_unit="ns",
time_zone="America/New_York",
eager=True,
).alias("America/New_York")
)
shape: (77_749, 1)
┌────────────────────────────────┐
│ America/New_York │
│ --- │
│ 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 │
│ 2022-01-03 00:20:00 EST │
│ … │
│ 2022-09-29 23:40:00 EDT │
│ 2022-09-29 23:45:00 EDT │
│ 2022-09-29 23:50:00 EDT │
│ 2022-09-29 23:55:00 EDT │
│ 2022-09-30 00:00:00 EDT │
└────────────────────────────────┘
然后,它就会起作用,因为 polars
可以从开始时间开始,并不断添加 5 分钟,这总是明确定义的。
如果您尝试先创建 UTC 日期范围,然后替换时区,那么您最终会得到不明确或不存在的日期时间(由于 DST)。