Polars Replace_time_zone 函数抛出“时区不存在”错误

问题描述 投票:0回答:2

这是我们要使用的测试数据:

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.
python datetime timezone python-polars
2个回答
2
投票

您无法将 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

您可以使用的
解决方法
是将 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 │ # │ … │

您需要直接将时区传递给

1
投票

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)。

© www.soinside.com 2019 - 2024. All rights reserved.