【问题标题】:Using dateutil. parser to account for timezones, but parse won't recognizer tzinfos?使用日期工具。解析器来解释时区,但解析不会识别 tzinfos?
【发布时间】:2020-04-10 12:32:29
【问题描述】:

我正在尝试从包含不同时区的列表中提取时间戳。 我正在使用 dateutil.parser。我相信我想为此使用 parse 函数,包括时区信息,但它似乎不想接受它们。谁能告诉我哪里出错了?

from dateutil.parser import parse
timezone_info = {
    "PDT": "UTC -7",
    "PST": "UTC -8",
    }
date_list = ['Oct 21, 2019 19:30 PDT',
             'Nov 4, 2019 18:30 PST']

for dates in date_list:
    print(parse(dates))
# This gives:
# 2019-10-21 19:30:00
# 2019-11-04 18:30:00

for date in date_list:
    print(parse(dates, tzinfos = timezone_info))

这是输出:

2019-10-21 19:30:00
2019-11-04 18:30:00
C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py:1218: UnknownTimezoneWarning: tzname PDT identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.
  category=UnknownTimezoneWarning)
C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py:1218: UnknownTimezoneWarning: tzname PST identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.
  category=UnknownTimezoneWarning)
Traceback (most recent call last):
  File "C:/Users/mbsta/PycharmProjects/untitled2/tester.py", line 16, in <module>
    print(parse(dates, tzinfos = timezone_info))
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py", line 1374, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py", line 660, in parse
    ret = self._build_tzaware(ret, res, tzinfos)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py", line 1185, in _build_tzaware
    tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\parser\_parser.py", line 1175, in _build_tzinfo
    tzinfo = tz.tzstr(tzdata)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\tz\_factories.py", line 69, in __call__
    cls.instance(s, posix_offset))
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\tz\_factories.py", line 22, in instance
    return type.__call__(cls, *args, **kwargs)
  File "C:\Users\mbsta\Anaconda3\envs\untitled2\lib\site-packages\dateutil\tz\tz.py", line 1087, in __init__
    raise ValueError("unknown string format")
ValueError: unknown string format

Process finished with exit code 1

【问题讨论】:

    标签: python-3.x pycharm timezone python-dateutil


    【解决方案1】:

    我认为这里的问题是您指定的偏移量不是tzstr 的有效格式,它需要看起来像TZ variable 的东西。如果将字符串分别更改为"PST+8""PDT+7",它将按预期工作。

    也就是说,我认为您最好使用tzfile,这是tzinfos 的主要用途之一:

    from dateutil import parser
    from dateutil import tz
    PACIFIC = tz.gettz("America/Los_Angeles")
    timezone_info = {"PST": PACIFIC, "PDT": PACIFIC}
    
    date_list = ["Oct 21, 2019 19:30 PDT",
                 "Nov 4, 2019 18:30 PST"]
    
    for dtstr in date_list:
        print(parser.parse(dtstr, tzinfos=timezone_info))
    

    打印出来:

    2019-10-21 19:30:00-07:00
    2019-11-04 18:30:00-08:00
    

    而且由于它附加了一个完整的时区偏移量,您可以对结果进行算术运算而不用担心(因为它是一个完整的时区,而不是一个固定的偏移量)。

    【讨论】:

    • 谢谢先生,非常感谢!我的日期列表将混合各种缩写时区。我是否需要为每个可能出现的内容创建类似 'PACIFIC = tz.gettz("America/Los_Angeles") '和 ' "PST": PACIFIC' 的内容?
    • 是的,三/四字母缩写通常是不明确的。如果要消除它们之间的歧义,则需要提供上下文。您可以使用字典之类的映射或将函数传递给 tzinfos。
    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多