2013-04-01 10 views
8

sto cercando di ottenere il fuso orario per la latitudine e longitudine, ma sto avendo alcuni problemi Gli errori sono probabilmente molto di baseOttenere il fuso orario da coordinate lat lunghe?

Ho una tabella in un database con circa 600 righe. Ogni riga contiene una coordinata long lat per un posto nel mondo Voglio alimentare queste coordinate in una funzione e quindi recuperare il fuso orario. L'obiettivo è di convertire gli eventi che hanno un timestamp locale in ciascuno di questi 600 posti nell'ora UTC

Ho trovato un blog post che utilizza a piece of code per ricavare fusi orari dalle coordinate geografiche.

Quando si tenta di eseguire il codice, viene visualizzato l'errore geonames is not defined. Ho fatto domanda per un account con geonames.

Penso di aver appena salvato il file di funzione nella directory sbagliata o qualcosa di semplice. Chiunque può aiutare

#------------------------------------------------------------------------------- 
# Converts latitude longitude into a time zone 
# REF: https://gist.github.com/pamelafox/2288222 
# REF: http://blog.pamelafox.org/2012/04/converting-addresses-to-timezones-in.html 
#------------------------------------------------------------------------------- 

geonames_client = geonames.GeonamesClient('Username_alpha') 
geonames_result = geonames_client.find_timezone({'lat': 48.871236, 'lng': 2.77928}) 
user.timezone = geonames_result['timezoneId'] 
+4

Sembra che non abbia * importato * 'geonames'. Aggiungi una linea 'import geonames'? –

+2

Vedere anche [questa voce wiki della comunità] (http://stackoverflow.com/q/16086962/634824) –

+1

correlati: [Ottieni il fuso orario da City in Python/Django] (http://stackoverflow.com/q/16505501/ 4279), vedi [esempio 'pytzwhere' nella mia risposta] (http://stackoverflow.com/a/16519004/4279). – jfs

risposta

1

Questo funziona come previsto:

import geonames 
geonames_client = geonames.GeonamesClient('demo') 
geonames_result = geonames_client.find_timezone({'lat': 48.871236, 'lng': 2.77928}) 
print geonames_result['timezoneId'] 

uscita:

'Europe/Paris' 
+0

@manuel_riel che libreria è questa ... importare i geonames? – sirvon

+1

Solo un pacchetto Python che include geonames.org. È in Pypi https://pypi.python.org/pypi/geonames/ –

+0

Il pacchetto che hai collegato non sembra avere una classe GeonamesClient. Stai forse usando un pacchetto diverso? – waterproof

2
import requests 
lat = 48.871236 ## your latitude 
lon = 2.77928 ## your longitude 

url = "http://api.geonames.org/timezoneJSON?formatted=true&lat={}&lng={}&username=demo".format(lat,lon) 

r = requests.get(url) ## Make a request 
return r.json()['timezoneId'] ## return the timezone 
+0

Funziona alla grande. Tuttavia, ci sono dei limiti di successo per l'uso di questo webservice? – Sean

8

Con tzwhere e pytz:

import datetime 
import pytz 
from tzwhere import tzwhere 

tzwhere = tzwhere.tzwhere() 
timezone_str = tzwhere.tzNameAt(37.3880961, -5.9823299) # Seville coordinates 
timezone_str 
#> Europe/Madrid 

timezone = pytz.timezone(timezone_str) 
dt = datetime.datetime.now() 
timezone.utcoffset(dt) 
#> datetime.timedelta(0, 7200) 
+1

Ha funzionato come soluzione off-line di cui avevamo bisogno. Anche se alcuni potrebbero incontrare un errore: OSError: Impossibile trovare lib geos_c o caricare una delle sue varianti durante l'importazione di tzwhere. Questo ha aiutato: http://stackoverflow.com/a/23057508/3699126 – sunsetjunks

+0

non funziona in mac os x sierra e python 2.7 –

+0

Qualsiasi ulteriore dettaglio? Messaggio di errore? Puoi provare con Python 3? – tuxayo

0

Sono stato in grado di fare una ricerca adeguata per i miei scopi che utilizzano timezonefinder:

import datetime 
import timezonefinder, pytz 

tf = timezonefinder.TimezoneFinder() 

# Get the tz-database-style time zone name (e.g. 'America/Vancouver') or None 
timezone_str = tf.certain_timezone_at(lat=49.2827, lng=-123.1207) 

if timezone_str is None: 
    print "Could not determine the time zone" 
else: 
    # Display the current time in that time zone 
    timezone = pytz.timezone(timezone_str) 
    dt = datetime.datetime.utcnow() 
    print "The time in %s is %s" % (timezone_str, dt + timezone.utcoffset(dt)) 

C'è una discussione dei metodi di timezonefinder e le sue limitazioni its pypi page.

timezonefinder e pytz possono essere trovati nei pacchetti pip con lo stesso nome.