pytz中缺少时区信息?

15

我在使用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

所以,您可以看到,它结束得相当仓促,并且缺少许多时区。

我试图通过更新pytz内部使用的Olson数据库来克服这个问题:

$ sudo pip install -U pytz

但问题仍然存在...

有什么想法可能出了问题吗?我有遗漏些什么吗?


1
'US/Eastern' 已被弃用 - Leonardo.Z
'Asia/Tokyo' 也不起作用。你在哪里找到关于弃用时区的信息? - Konstantin Greger
@Leonardo.Z US/Eastern 存在于 pytz 中。 - Jacob Budin
忘记我的第一个评论,正如Jacob所说,它是错误的。你的pytz版本是多少? - Leonardo.Z
如果您正在使用类似virtualenv的东西,sudo pip将会更新系统包而不是本地包。 - Leonardo.Z
@Konstantin Greger - ClearMyMac似乎是导致这个问题的罪魁祸首。我发现在Mac 10.10下使用“UninstallPKG”应用程序也会删除zoneinfo。 - CodeFarmer
9个回答

11

当我尝试在最新的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 ...来同步主机时区。 - Radon Rosborough
这对我不起作用,因为它会等待输入提示。 - Nam G VU

7
了解一下,pytz中的时区数据来自IANA时区数据库,也称为Olson数据库或简称tz数据库

在这个数据中,某些标识符(例如US/Eastern)仅是指针(也称为“链接”或“别名”),指向真正的时区。链接有多种不同的原因,通常是为了向后兼容。在这种情况下,US/Eastern时区是指向America/New_York的链接,这是您应该使用的真实时区。(我相信这个特定的切换发生在1993年)。

您可以在此处查看其他仅用于向后兼容的时区。另请参见维基百科上的这个图表,其中列出了时区,并清楚地指出哪些时区是链接以及这些链接指向何处。

至于为什么pytz不接受您系统上向后兼容的时区,我不太确定。它肯定应该,并且在其文档中甚至显示了这些。您可以像Jacob建议的那样重新安装它。但即使如此,您也应该优先选择America/New_York而不是US/Eastern


3
我不确定为什么你安装的pytz出了问题,但这里有一个可能的解决方法:
  1. 从Python Package Index下载 pytz的.zip归档文件
  2. 在Terminal.app中运行 pip show pytz
  3. 使用它返回的路径,在终端中运行 open /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python(如果路径不同,替换成你自己的)。这将启动一个Finder窗口,其中包含了您的Python模块。
  4. 找到pytz/文件夹,打开它。
  5. 用你从PyPI下载的.zip归档文件中的zoneinfo/文件夹替换pytz/文件夹中的zoneinfo/文件夹。

2

在一个Spark集群中,所有的解决方案都对我无效。但是我找到了"pendulum"库,它可以很好地工作。

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

1
尝试重新安装,但错误未消失。 然后,我打开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)

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

1

我遇到了类似的问题,问题最终是由于 pip 安装之前失败导致的。以下步骤解决了我的问题:

pip uninstall -y pytz
pip install pytz

0

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


0

查看 pytz/init.py 文件,看看你的时区是否存在。在我的情况下是 'America/Argentina/Buenos_Aires'。


0

对我来说,更新pytz包只需要通过pip3 -install pytz --update就可以轻松完成。但在AWS Linux机器上,我需要像这样执行:python3 -m pip install pytz --update

我的应用程序报错:unknown timezone 'America/Punta_Arenas'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接