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!