2012-10-22 7 views
9

나는 pytz을 사용하고 있습니다. 전체 설명서를 읽었지만 이것이 어떻게 수행되는지는 알지 못했습니다.pytz를 사용하여 시간대 국가 코드를 가져 옵니까?

시간대가 아메리카/시카고입니다. 내가 원하는 것은이 시간대에 해당하는 국가 코드를 얻는 것입니다 : US.

내가 같은 반대를 할 수 있음을 보여줍니다 :

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

하지만 난 주위에 그것을 다른 방법으로 할 필요가있다.

pytz를 사용하여 파이썬에서이 작업을 수행 할 수 있습니까?

답변

9

당신은 pytz에서 country_timezones 객체를 사용하여 역 매핑을 생성 할 수 있습니다

from pytz import country_timezones 

timezone_country = {} 
for countrycode in country_timezones: 
    timezones = country_timezones[countrycode] 
    for timezone in timezones: 
     timezone_country[timezone] = countrycode 

지금 바로 결과 사전을 사용

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

다른 국가에서 동일한 시간대 이름을 사용하면 깨질 수 있습니다. 'country_timezones'에는 그런 이름이 없습니다. 하지만 일부 일반적인 시간대는 UTC, 미국/중부, 미국/동부, 캐나다/중앙 등이 아닙니다. – jfs

+0

@ J.F.Sebastian 마지막 문장은 무엇을 의미합니까? 그 시간대는 무엇에 있지 않습니까? – Snowman

+0

'pytz'에 정의 된 모든 시간대는 정확하게 하나의 국가에 매핑됩니다. 따라서, 그것은 깨지지 않습니다. – jsalonen

2

이 쉽게입니다. 각 국가를 시간대 목록에 매핑하는 dict이 있습니다. 각 list 회원을 dict에 다시 매핑하고 싶습니다.

답을 제공하기보다는 가져 오는 방법을 알아 보겠습니다. 당신은 단지 하나의 시간대에 각 나라를 매핑 dict이 있다면

첫째,이 간단한 역 매핑 될 것이다 :

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

하지만이 작동하지 않습니다; 당신은 시간대 목록에 대한 매핑을 가지고 있으며, 그 목록에있는 각 시간대를 다시 국가로 매핑하려고합니다. 그 영어 ​​설명 "그 목록의 각 시간대는"파이썬 하찮게 번역 : 그것은 행동에 여기

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

:

>>> 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' 

사이드 참고 : 파이썬 2 대 3을 언급하지 않았다, 그래서 나는 2라고 생각했습니다. 3을 사용하는 경우 iteritemsitems으로 변경하면 u'CH' 대신에 출력이 'CH'이됩니다.

관련 문제