【问题标题】:Timezone Information Missing in pytz?pytz中缺少时区信息?
【发布时间】:2014-03-10 03:46:44
【问题描述】:

我在使用 Python 的 pytz 时遇到了一个非常奇怪的问题:我的系统上的时区目录似乎不完整(MacOS X 10.8.5,系统 Python 2.7.5)。

>>> from pytz import timezone
>>> import pytz

>>> utc = pytz.utc
>>> utc.zone
'UTC'

>>> eastern = timezone('US/Eastern')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pytz/__init__.pyc", line 182, in timezone

pytz.exceptions.UnknownTimeZoneError: 'US/Eastern'

所以找不到时区'US/Eastern'。 因此,我尝试查看pytz 提供的时区目录:

>>> from pytz import all_timezones
>>> for tz in pytz.all_timezones:
...     print tz
... 
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
Africa/Lome
Africa/Luanda
Africa/Lubumbashi
Africa/Lusaka
Africa/Malabo
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Mogadishu
Africa/Monrovia
Africa/Nairobi
Africa/Ndjamena
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Porto-Novo
Africa/Sao_Tome
Africa/Timbuktu
Africa/Tripoli
Africa/Tunis
Africa/Windhoek
America/Adak
America/Anchorage
America/Anguilla
America/Antigua
America/Araguaina
America/Argentina/Buenos_Aires
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Argentina/Cordoba
America/Argentina/Jujuy
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/Rio_Gallegos
America/Argentina/Salta
America/Argentina/San_Juan
America/Argentina/San_Luis
America/Argentina/Tucuman
America/Argentina/Ushuaia
America/Aruba
America/Asuncion
America/Atikokan
America/Atka
America/Bahia
America/Bahia_Banderas
America/Barbados
America/Belem
America/Belize
America/Blanc-Sablon
America/Boa_Vista
America/Bogota
America/Boise
America/Buenos_Aires
America/Cambridge_Bay
America/Campo_Grande
America/Cancun
America/Caracas
America/Catamarca
America/Cayenne
America/Cayman
America/Chicago
America/Chihuahua
America/Coral_Harbour
America/Cordoba
America/Costa_Rica
America/Creston
America/Cuiaba
America/Curacao
America/Danmarkshavn
America/Dawson
America/Dawson_Creek
America/Denver
America/Detroit
America/Dominica
America/Edmonton
America/Eirunepe
America/El_Salvador
America/Ensenada
America/Fort_Wayne
America/Fortaleza
America/Glace_Bay
America/Godthab
America/Goose_Bay
America/Grand_Turk
America/Grenada
America/Guadeloupe
America/Guatemala
America/Guayaquil
America/Guyana
America/Halifax
America/Havana
America/Hermosillo
America/Indiana/Indianapolis
America/Indiana/Knox
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Tell_City
America/Indiana/Vevay
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indianapolis
America/Inuvik
America/Iqaluit
America/Jamaica
America/Jujuy
America/Juneau
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Knox_IN
America/Kralendijk
America/La_Paz
America/Lima
America/Los_Angeles

如您所见,它过早地结束,并且缺少许多时区。 我试图通过更新 Olson 数据库 pytz 内部使用来克服这个问题:

$ sudo pip install -U pytz

但问题依然存在……

您知道这里可能出了什么问题吗?我错过了什么吗?

【问题讨论】:

  • 'US/Eastern' 已弃用
  • 'Asia/Tokyo' 也不起作用。您在哪里找到有关已弃用时区的信息?
  • @Leonardo.Z US/Eastern 存在于 pytz 中。
  • 忘记我的第一条评论,正如雅各布所说,这是错误的。你的 pytz 版本是多少?
  • 如果你使用的是 virtualenv 之类的东西,sudo pip 将更新系统的包而不是本地包。

标签: python timezone pytz


【解决方案1】:

我不能说为什么你的 pytz 安装被破坏了,但这里有一个可能的修复方法:

  1. 下载pytz from the Python Package Index的.zip压缩包。
  2. 在 Terminal.app 中,运行 pip show pytz
  3. 使用它返回的路径,运行open /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python(如果不同,请将我的路径替换为您的路径)。这将启动一个包含您的 Python 模块的 Finder 窗口。
  4. 找到 pytz/ 文件夹。打开它。
  5. 将 zoneinfo/ 文件夹替换为您在步骤 1 中从 PyPI 下载的 .zip 存档中的 zoneinfo/ 文件夹。

【讨论】:

    【解决方案2】:

    了解pytz中的时区数据来自IANA time zone database,也称为奥尔森数据库,或者简称为the tz database

    在此数据中,某些标识符(例如US/Eastern)只是指向真实时区的指针(又名“链接”或“别名”)。链接的存在有几个不同的原因,通常是出于向后兼容的目的。在这种情况下,US/Eastern 时区是指向 America/New_York 的链接,这是您应该使用的真实时区。 (我相信这个特殊的转变发生在 1993 年)。

    您可以查看为了向后兼容而提供的其他时区here。另请参阅this chart on Wikipedia,它列出了时区,并清楚地指出了哪些区域是链接以及这些链接指向的位置。

    至于 为什么 pytz 不接受您系统上的向后兼容区域,我不确定。它当然应该,甚至在他们的文档中显示这些。您可以尝试按照 Jacob 的建议重新安装它。但即便如此,你应该更喜欢America/New_York 而不是US/Eastern

    【讨论】:

      【解决方案3】:

      对我来说,就像通过 pip3 -install pytz --update 更新 pytz 包一样简单,在 AWS linux 机器上我必须像这样执行它 python3 -m pip install pytz --update

      我的应用抱怨unknown timezone 'America/Punta_Arenas'

      【讨论】:

        【解决方案4】:

        当我尝试在具有最新 ubuntu 映像的 docker 容器中运行我的应用程序时,我遇到了类似的异常 UnknownTimeZoneError: Can not find any timezone configuration。原来tzdata 不见了。安装tzdata 包修复它:

        apt-get install -y tzdata
        
        # Maybe you will need to reconfigure the timezone as well:
        ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime
        dpkg-reconfigure -f noninteractive tzdata
        

        (如果需要,请使用sudo

        【讨论】:

        • 对于 Alpine Linux 镜像,在 Dockerfile 中使用apk add --no-cache tzdata,然后使用docker run -v /etc/timezone:/etc/timezone:ro ... 同步主机时区。
        • 这对我不起作用,因为它会提示等待输入
        【解决方案5】:

        尝试重新安装,但错误没有消失。

        然后,我打开pytz/__init__.py,添加一行zone = 'UTC',问题就解决了:

        zone = _unmunge_zone(zone)
        zone = 'UTC'
        if zone not in _tzinfo_cache:
            if zone in all_timezones_set:
                fp = open_resource(zone)
                try:
                    _tzinfo_cache[zone] = build_tzinfo(zone, fp)
                finally:
                    fp.close()
            else:
                raise UnknownTimeZoneError(zone)
        

        这是一个快速简单的解决方案,但如果你有时间,最好找到真正的问题(版本?系统?)。

        【讨论】:

          【解决方案6】:

          我遇到了类似的问题,问题最终是 pip 安装之前失败了。这为我解决了问题:

          pip uninstall -y pytz
          pip install pytz
          

          【讨论】:

            【解决方案7】:

            所有解决方案在 Spark 集群中都不适用于我。但我找到了“钟摆”库,它工作得很好。

            import pendulum
            timezone = pendulum.timezone('Europe/Saratov')
            

            【讨论】:

              【解决方案8】:

              我遇到了类似的问题(Mac 和 python 3.6)。 它找到了很多时区,但在America 下没有。 由于某种原因(可能由于pycharm设置),目录/lib/python3.6/site-packages/pytz/zoneinfo下的目录名存在大小写冲突 例如,有一个空的america 目录和一个名为america (Case Conflict) 的目录(以及其他类似目录)。 将此目录重命名为America 即可解决问题。

              【讨论】:

                【解决方案9】:

                查看 pytz/init.py 并查看您的区域是否存在。 在我的情况下是“美国/阿根廷/布宜诺斯艾利斯”。

                【讨论】:

                  猜你喜欢
                  • 2021-09-06
                  • 2020-07-17
                  • 1970-01-01
                  • 2010-10-11
                  • 2012-12-17
                  • 2017-02-20
                  • 1970-01-01
                  • 2016-08-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多