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',
...
}
Любые предложения приветствуются!