2012-10-22 11 views
9

Sto usando pytz. Ho letto l'intero foglio della documentazione, ma non ho visto come questo potrebbe essere fatto.Ottieni il codice del paese per il fuso orario usando pytz?

Ho un fuso orario: America/Chicago. Tutto quello che voglio è ottenere il codice del rispettivo paese per questo fuso orario: Stati Uniti.

Esso dimostra che posso fare il contrario, come ad esempio:

>>> country_timezones('ch') 
['Europe/Zurich'] 
>>> country_timezones('CH') 
['Europe/Zurich'] 

ma ho bisogno di farlo il contrario.

Questo può essere fatto in Python, usando pytz (o qualsiasi altro modo per questo)?

risposta

9

È possibile utilizzare l'oggetto country_timezones da pytz e generare una mappatura inversa:

Ora basta utilizzare il dizionario risultante:

>>> timezone_country['Europe/Zurich'] 
u'CH' 
+0

si interromperà se lo stesso nome fuso orario viene utilizzato in diversi paesi. Non ci sono nomi di questo tipo in "country_timezones". Ma alcuni timezone comuni non ci sono, ad esempio UTC, USA/Centrale, Stati Uniti/Est, Canada/Centrale, ecc. – jfs

+0

@ J.F.Sebastian, cosa intendevi con la tua ultima frase? Quei fusi orari non sono in cosa? – Snowman

+0

Tutti i fusi orari definiti in 'pytz' corrispondono esattamente a un paese. Quindi, non si spezza. – jsalonen

2

Questo è facile. Hai un dict mappatura di ciascun paese in un elenco di fusi orari. Si desidera mappare ogni membro list allo dict.

Piuttosto che dare la risposta, vediamo come ottenerlo.

In primo luogo, se hai appena avuto un dict mappatura ogni paese per un unico fuso orario, questo sarebbe un semplice mappatura inversa:

timezone_countries = {timezone: country 
         for country, timezone in country_timezones.iteritems()} 

Ma questo non funzionerà; hai una mappatura di un elenco di fusi orari e vuoi che ogni fuso orario in quella lista ricolleghi al Paese. Tale descrizione inglese "ogni fuso orario in quella lista" è banalmente traducibile a Python:

timezone_countries = {timezone: country 
         for country, timezones in country_timezones.iteritems() 
         for timezone in timezones} 

Eccolo in azione:

>>> from pytz import country_timezones 
>>> timezone_countries = {timezone: country 
          for country, timezones in country_timezones.iteritems() 
          for timezone in timezones} 
>>> timezone_countries['Europe/Zurich'] 
u'CH' 

Nota a margine: Non hai parlato di Python 2 vs 3, quindi ho presupposto 2. Se sei su 3, modifica iteritems a items e l'output sarà 'CH' anziché u'CH'.

Problemi correlati