pytz: вернуть имя часового пояса Олсона только из смещения по Гринвичу

У меня есть устаревшее приложение, которое мне нужно будет дополнить некоторыми данными. В настоящее время у нас есть таблица БД, в которой хранятся почтовые индексы США (и ее территорий), а также смещение по Гринвичу и флаг, показывающий, использует ли этот почтовый индекс летнее время. Это было загружено с какого-то бесплатного провайдера, который я не могу найти источник прямо сейчас.

Теперь мне нужно дополнить эту таблицу полным именем Олсона (например,America/New York) каждого почтового индекса, потому что это, кажется, единственный хороший способ преобразовать определенную дату / время, сохраненное в базе данных, как локальное для этого покупателя вUTC aware datetime объект.

Вот посмотрите на стол:

zip    state  city          lat      lon       gmt  dst 
00605  PR     AGUADILLA     18.4372  -67.1593  -4   f
02830  RI     HARRISVILLE   41.9782  -71.7679  -5   t
99503  AK     ANCHORAGE     61.1895  -149.874  -9   t

В другой связанной таблицеPurchases, У меня естьpostres timestamp without tz столбец, который в настоящее время содержит что-то вроде2014-05-27T15:54:26, что представляет собой некоторое время, когда местная покупка была сделана по этому почтовому индексу. (игнорировать глупость удаления информации о часовом поясе при сохранении этих локализованных временных меток в базе данных)

Большой вопрос:

Как я могу создать нормализованныйUTC time От этогоtimestamp строка для каждого почтового индекса вzipcode Таблица? Это предполагает, что отметка времени была записана в БД как локальная для каждой строки примера вzipcode Таблица.

Например, вручную просматривая имена часовых поясов Олсона для каждого элемента в таблице примеров, я обнаружил следующее:

>>> timestring = '2014-05-27T15:54:26'
>>> dt_naive = datetime.strptime(timestring, '%Y-%m-%dT%H:%M:%S')

>>> # First example - Puerto Rico (no DST since 1945)
>>> print pytz.utc.normalize(pytz.timezone('America/Puerto_Rico').localize(dt_naive))
2014-05-27 19:54:26+00:00

# Second example - Road Island (At that timestamp, UTC Offset was same as PR because of DST)
>>> print pytz.utc.normalize(pytz.timezone('US/Eastern').localize(dt_naive))
>>> 2014-05-27 19:54:26+00:00

# Third Example - Anchorage, AK (AKDT at timestamp)
>>> print pytz.utc.normalize(pytz.timezone('America/Anchorage').localize(dt_naive))
2014-05-27 23:54:26+00:00

Я видел несколько коммерческих продуктов, продающих базу данных zipcode, которая может дать мне поиск zipcode -> timezone. Тем не менее, они, кажется, дают мне только «EST» для данного часового пояса. Итак, я подумал, что могу сопоставить список возможных часовых поясов для американских часовых поясов (включая территории) с именами олсонов для каждого. Это может выглядеть примерно так:

zipcode_olson_lookup = {
    ('PR', 'f', 'AST'): 'America/Puerto_Rico',
    ('AK', 'f', 'AKDT',): 'America/Anchorage',
    ('AK', 't', 'AKT',): 'America/Anchorage',
    ...
}

Любые предложения приветствуются!

Ответы на вопрос(1)

Ваш ответ на вопрос