我对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
但问题仍然存在......
任何想法可能会出错?我错过了什么吗?
答案 0 :(得分:6)
了解pytz中的时区数据来自IANA time zone database,也称为Olson数据库,或只是the tz database。
在此数据中,某些标识符(例如US/Eastern
)只是指向真实时区的指针(也称为“链接”或“别名”)。链接有几个不同的原因,通常是出于向后兼容的目的。在这种情况下,US/Eastern
时区是指向America/New_York
的链接,这是您应该使用的真实时区。 (我相信这个特殊的转变发生在1993年)。
您可以看到仅用于向后兼容的其他时区here。另请参阅列出时区的this chart on Wikipedia,并清楚地指出哪些区域是链接以及这些链接指向的位置。
至于为什么 pytz不接受系统上的向后兼容区域,我不确定。它当然应该,甚至在他们的文档中显示这些。您可以尝试重新安装它,正如雅各布建议的那样。但即使这样,您也应该更喜欢America/New_York
而不是US/Eastern
。
答案 1 :(得分: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
)
答案 2 :(得分:2)
我不知道为什么你的pytz安装坏了,但这是一个可能的解决办法:
pip show pytz
。open /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
(如果不同,则替换我的路径)。这将使用您的Python模块启动Finder窗口。答案 3 :(得分:0)
对我而言,通过pip3 -install pytz --update
更新pytz包很容易在AWS linux机器上,我必须执行它python3 -m pip install pytz --update
我的应用抱怨unknown timezone 'America/Punta_Arenas'
答案 4 :(得分:0)
尝试重新安装,但错误没有消失。
然后,我打开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)
这是一种快速简单的解决方案,但是如果有时间,您最好找到真正的问题(版本?系统?)。
答案 5 :(得分:0)
我遇到了一个类似的问题,问题最终是以前pip安装失败。这对我来说是固定的:
pip uninstall -y pytz
pip install pytz
答案 6 :(得分:0)
在Spark集群中,所有解决方案均不适用于我。但是我找到了“钟摆”库,它很好用。
import pendulum
timezone = pendulum.timezone('Europe/Saratov')
答案 7 :(得分:0)
我有一个类似的问题(Mac和python 3.6)。
它发现了许多时区,但在America
下没有。
由于某些原因(可能是由于pycharm设置),目录/lib/python3.6/site-packages/pytz/zoneinfo下的目录名称存在大小写冲突
例如,有一个空的america
目录和一个名为america (Case Conflict)
的目录(以及其他类似目录)。
将目录重命名为America
解决了该问题。
答案 8 :(得分:0)
查看 pytz/init.py 并查看您的区域是否存在。 就我而言,“美国/阿根廷/布宜诺斯艾利斯”。