gpt4 book ai didi

python - 如何使用 dateutil.tz.tz.tzoffset 来本地化使用 strptime 创建的时区原始日期时间?

转载 作者:行者123 更新时间:2023-12-05 09:13:25 24 4
gpt4 key购买 nike

如何使用类型为 dateutil.tz.tz.tzoffset 的对象来本地化具有正确时区和 DST 信息的时区原始日期时间对象,以便将其正确转换为 UTC?或者,如何将 dateutil.tz.tz.tzoffset 转换为 pytz.timezone?

我一直无法找到有关使用 dateutil.tz.tz.tzoffset 对象本地化日期时间对象的有用信息。请参阅下面的一些我评论过的更好的文章。

背景信息:

我正在处理大量日期字符串,其中大部分没有时区信息。在某些情况下,时间为格林威治标准时间,而在其他情况下,时间为本地时间。我必须首先确定创建这些各种日志的设备的时区,然后解析各种日期字符串,如果是本地时间则添加添加时区,最后将其转换为 UTC。

除了确定时区的唯一可靠方法是从日期格式为 EDT、IST 等的文本文件外,我几乎已经完成了所有这些工作,所以我在下面使用了最受好评的帖子链接以使用 dateutil 的 parser.parse() 函数完成此操作,并为它的 tzinfos 参数发送一个字典。 (Parsing date/time string with timezone abbreviated name in Python?)

但是,这给我留下了一个具有 tzinfo type=dateutil.tz.tz.tzoffset 的 DateTime。我没问题,除非我需要使用这个 tzinfo 来本地化不包含时区信息的字符串,并且 dateutil.tz.tz.tzoffset 类型没有像 pytz.timezone 那样的本地化选项,这是症结所在我的问题。

我是不是太难了?我是否只是将时区原始日期时间中的 tzinfo 替换为我保存的 dateutil.tz.tz.tzoffset 对象?

代码:

下面读取日期字符串并将其保存为日期时间对象,将时区保存在 var 中供以后使用,然后将日期字符串转换为 UTC:

from dateutil.parser import parse as parsedate
import pytz
from pytz import timezone
from datetime import datetime

timestr = 'Sat, 5/01/2019 8:00PM EDT' #only reliable source of timezone info
dtfromstrEDT = parsedate(timestr, tzinfos=tzd) #tzd is created from the above link
mytimeZone = dtfromstrEDT.tzinfo # save local timezone
dtUTC = dtfromstrEDT.astimezone(pytz.timezone('UTC')) # convert to utc

现在这是一个新的时区原始日期字符串。它是在与上述相同的本地时间 (EDT) 中记录的,因此我想使用我保存的 mytimeZone var 对其进行本地化并转换为 UTC。我使用标准 strptime 将其作为天真的日期时间读取。但是,当使用 mytimeZone 本地化 Naive 日期时间时,它失败了。错误如下。我明白错误;但我不知道如何完成我需要的:

timestrnaive = 'Mar 15 12:09:20 2019' #in EDT time, same as above string but without any timezone info
dtfromstrNaive = datetime.strptime(timestrnaive, "%b %d %H:%M:%S %Y")
dtlocalized = mytimeZone.localize(dtfromstrNaive, is_dst=True)
# the above is where it fails with provided error below
# however I can do this instead if I had a pytz.timezone object:
loc_tz = pytz.timezone('America/New_York')
dtlocalized = loc_tz.localize(dtfromstrNaive, is_dst=True)
dtUTC2 = dtlocalized.astimezone(pytz.timezone('UTC')) # convert to utc

错误:

Traceback (most recent call last):
File "C:\Examples\timezones.py", line 221, in <module>
dtlocalized = mytimeZone.localize(dtfromstrNaive, is_dst=True) # convert to whatever tz is stored in self.timeZone
AttributeError: 'tzoffset' object has no attribute 'localize'

评论了以下内容:

Localize datetime (timezone aware) from timezone offset - 我不确定如何将其应用于此问题,因为我有一个 dateutil.tz.tz.tzoffset 对象,而不是原始的 utc 时间。

Parsing date/time string with timezone abbreviated name in Python? - 这让我可以读取时区数据,例如 EDT 和 PDT。

How to make an unaware datetime timezone aware in python - 这没有帮助,因为它没有解决我提到的 dateutil.tz.tz.tzoffset 问题。

最佳答案

你在这里怀有的主要误解是你需要 localize 方法,这是 pytz 中的一个历史工件,从 PEP 495 添加“折叠”之前的时代开始“属性。您可以在 this article 中阅读更多有关 pytz 偏离标准库接口(interface)的原因的信息。 .

正如您在回答中指出的那样,对于pytz 区域以外的任何,您可以简单地使用.replace 来构造一个新的日期时间适当的时区。还有一个dateutil.utils.default_tzinfo方便的函数,它将自动检测日期时间是否是原始的,如果是,则将默认值附加到 tzinfo

另一件需要注意的事情是你在这里使用 pytz 是不必要的,因为 dateutil 也提供了一个 UTC 对象,所以你可以做这样的事情:

from dateutil import tz
timestrnaive = 'Mar 15 12:09:20 2019'
dtfromstrNaive = datetime.strptime(timestrnaive, "%b %d %H:%M:%S %Y")
dtlocalized = dtfromstrNaive.replace(tzinfo=mytimeZone)
dtUTC2 = dtlocalized.astimezone(tz.UTC) # Convert to UTC

因此您不需要对 pytz 保持任何依赖。

如果你想了解更多关于在Python中使用时区的知识,我也recently gave a talk about this at PyCon .

关于python - 如何使用 dateutil.tz.tz.tzoffset 来本地化使用 strptime 创建的时区原始日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56174060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com