这是我们要使用的测试数据:
import polars as pl
import pandas as pd
from datetime import date, time, datetime
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")
)
我特别需要 replace_time_zone
来实际更改底层时间戳,但相同的时区适用于 convert_time_zone
,但使用 replace_time_zone
失败。
df.select(
pl.col("UTC").dt.convert_time_zone(time_zone="America/New_York").alias("US")
)
# output
shape: (77761, 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-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 │
df.select(
pl.col("UTC").dt.replace_time_zone(time_zone="America/New_York").alias("US")
)
# error output
thread '<unnamed>' panicked at 'No such local time', /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chrono-0.4.23/src/offset/mod.rs:186:34
---------------------------------------------------------------------------
PanicException Traceback (most recent call last)
Cell In[78], line 1
----> 1 df.select(
2 pl.col("UTC").dt.replace_time_zone(time_zone="America/New_York").alias("US")
3 )
File ~/Live-usb-storage/projects/python/alpha/lib/python3.10/site-packages/polars/dataframe/frame.py:6432, in DataFrame.select(self, exprs, *more_exprs, **named_exprs)
6324 def select(
6325 self,
6326 exprs: IntoExpr | Iterable[IntoExpr] | None = None,
6327 *more_exprs: IntoExpr,
6328 **named_exprs: IntoExpr,
6329 ) -> Self:
6330 """
6331 Select columns from this DataFrame.
6332
(...)
6429
6430 """
6431 return self._from_pydf(
-> 6432 self.lazy()
6433 .select(exprs, *more_exprs, **named_exprs)
6434 .collect(no_optimization=True)
6435 ._df
6436 )
File ~/Live-usb-storage/projects/python/alpha/lib/python3.10/site-packages/polars/lazyframe/frame.py:1443, in LazyFrame.collect(self, type_coercion, predicate_pushdown, projection_pushdown, simplify_expression, no_optimization, slice_pushdown, common_subplan_elimination, streaming)
1432 common_subplan_elimination = False
1434 ldf = self._ldf.optimization_toggle(
1435 type_coercion,
1436 predicate_pushdown,
(...)
1441 streaming,
1442 )
-> 1443 return pli.wrap_df(ldf.collect())
PanicException: No such local time
最佳答案
您无法将 UTC 时间序列中的时区替换为具有 DST 转换的时区 - 您最终会得到不存在和/或丢失的日期时间。该错误可能会提供更多信息,但我不认为这特定于极坐标。
这是一个例子。 “America/New_York”有 DST transition on Mar 13 。 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 │
# │ … │
关于python - Polars Replace_time_zone 函数抛出错误 "no such local time",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75793219/