pytz: retorna o nome do fuso horário Olson apenas de um deslocamento GMT

Eu tenho um aplicativo herdado com o qual preciso suplementar alguns dados. Atualmente, temos uma tabela de banco de dados que armazena códigos postais dos EUA (e seus territórios), juntamente com um deslocamento GMT e uma bandeira mostrando se esse CEP usa o horário de verão. Isso foi baixado de algum provedor gratuito, no qual não consigo encontrar a fonte no momento.

Agora, preciso suplementar esta tabela com o nome completo do Olson (por exemplo,America/New York) de cada CEP, porque essa parece ser a única maneira de converter uma data / hora armazenada no banco de dados como local para o comprador em umUTC aware datetime objeto.

Aqui está uma olhada na tabela:

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

Em outra tabela relacionadaPurchases, Eu tenho umpostres timestamp without tz coluna, que atualmente contém algo como2014-05-27T15:54:26, que representa algum tempo local em que uma compra foi feita naquele código postal. (ignore a estupidez de eliminar as informações de fuso horário ao salvar esses carimbos de data e hora localizados no banco de dados)

A grande pergunta é:

Como posso criar um arquivo normalizadoUTC time a partir dessetimestamp sequência para cada CEP nozipcode mesa? Isso pressupõe que o registro de data e hora tenha sido gravado no banco de dados como local para cada uma das linhas de exemplo nozipcode mesa.

Por exemplo, procurando manualmente os nomes de fuso horário da Olson para cada item da tabela de exemplo, eu venho com o seguinte:

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

Eu já vi vários produtos comerciais vendendo um banco de dados de CEP, o que pode me fornecer uma pesquisa de CEP -> fuso horário. No entanto, eles parecem me fornecer apenas "EST" para um determinado fuso horário. Então, pensei em mapear a lista de possíveis fusos horários para os fusos horários dos EUA (incluindo territórios) com um nome olson para cada um. Isso pode ser algo como isto:

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

Todas as sugestões são muito bem-vindas!

questionAnswers(1)

yourAnswerToTheQuestion