Используя dateutil. парсер для учета часовых поясов, но парсер не распознает Цинфос? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь извлечь метки времени из списка, который содержит разные часовые пояса. Я использую dateutil.parser. Я считаю, что хочу использовать для этого функцию разбора, включая информацию о часовом поясе, но, похоже, она не хочет их принимать. Может кто-нибудь сказать мне, где я иду не так?

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

1 Ответ

2 голосов
/ 10 апреля 2020

Я считаю, что проблема заключается в том, что указанные смещения не являются допустимым форматом для tzstr, который ожидает что-то, похожее на переменную TZ . Если вы измените строки на "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

И так как он придает полное смещение часового пояса, вы можете сделать арифметику c на результаты не беспокоясь (поскольку это полный часовой пояс, а не фиксированное смещение).

...