¿Información de zona horaria que falta en pytz?

Estoy teniendo un problema muy raro con pytz : parece tener un catálogo incompleto de zonas horarias en mi sistema (MacOS X 10.8.5, sistema 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 "", line 1, in  File "pytz/__init__.pyc", line 182, in timezone pytz.exceptions.UnknownTimeZoneError: 'US/Eastern' 

Así que no se puede encontrar la zona horaria 'US/Eastern' En consecuencia, intenté echar un vistazo al catálogo de zonas horarias que ofrece 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/Crestn 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 

Como puede ver, termina de manera prematura y faltan muchas zonas horarias. Intenté superar esto actualizando la base de datos Olson que pytz usa internamente:

 $ sudo pip install -U pytz 

Pero el problema persiste …

¿Alguna idea de lo que podría estar mal aquí? ¿Me estoy perdiendo de algo?

No puedo decir por qué su instalación de pytz está rota, pero aquí hay una posible solución:

  1. Descargue el archivo .zip de pytz del Índice de paquetes de Python .
  2. En Terminal.app, ejecuta pip show pytz .
  3. Usando la ruta que devuelve, ejecute open /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (reemplazando mi ruta con la suya si es diferente). Esto abrirá una ventana del Finder con tus módulos de Python.
  4. Encuentra la carpeta / pytz. Abrelo.
  5. Reemplace la carpeta zoneinfo / con la carpeta zoneinfo / que está en el archivo .zip que descargó en el paso 1 de PyPI.

Comprenda que los datos de zona horaria en pytz provienen de la base de datos de zona horaria de la IANA , también conocida como la base de datos Olson, o simplemente la base de datos tz .

En estos datos, ciertos identificadores (como US/Eastern ) son simplemente punteros (también conocidos como “enlaces” o “alias”) a la zona horaria real . Los enlaces están ahí por varias razones diferentes, generalmente con fines de compatibilidad hacia atrás. En este caso, la zona horaria de US/Eastern es un enlace a America/New_York , que es la verdadera zona horaria que debe usar. (Creo que este cambio en particular ocurrió en 1993).

Puede ver otras zonas horarias que están ahí para compatibilidad con versiones anteriores aquí . Consulte también este cuadro en Wikipedia que enumera las zonas horarias e indica claramente qué zonas son enlaces y hacia dónde apuntan esos enlaces.

En cuanto a por qué pytz no está aceptando zonas compatibles con versiones anteriores en su sistema, no estoy exactamente seguro. Ciertamente debería, e incluso muestra esto en su documentación. Puedes intentar reinstalarlo como sugirió Jacob. Pero incluso entonces, debería preferir America/New_York lugar de US/Eastern .

Tuve una excepción similar UnknownTimeZoneError: Can not find any timezone configuration cuando intenté ejecutar mi aplicación dentro de un contenedor docker con las últimas imágenes de Ubuntu. Resultó que tzdata el tzdata . Instalar el paquete tzdata arregló:

 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 

(Use sudo si tiene que)

Para mí fue tan fácil como actualizar el paquete pytz a través de pip3 -install pytz --update En las máquinas AWS Linux, tuve que ejecutarlo de esta manera python3 -m pip install pytz --update

Mi aplicación se quejaba de la unknown timezone 'America/Punta_Arenas'

Intenté volver a instalar, pero el error no se ha ido.

Luego, abro pytz/__init__.py , agrego una zone = 'UTC' línea zone = 'UTC' , el problema desapareció:

 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) 

Esta es una solución rápida y simple, pero es mejor que encuentre el problema real (¿versión? ¿Sistema?) Si tiene tiempo.