Getting Time Zone from Lat Long Coordinates?
Question:
I am trying to get the time zones for latitude and longitude coordinates but am having a few problems
The mistakes are probably very basic
I have a table in a database with around 600 rows. Each row contains a lat long coordinate for somewhere in the world
I want to feed these co-ordinates into a function and then retrieve the time zone. The aim being to convert events which have a local time stamp within each of these 600 places into UTC time
I found a blog post which uses a piece of code to derive timezones from geographical coordinates.
When I try to run the code, I get the error geonames is not defined
. I have applied for an account with geonames.
I think I have just saved the function file in the wrong directory or something simple. Can anyone help
#-------------------------------------------------------------------------------
# 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']
Answers:
This works as expected:
import geonames
geonames_client = geonames.GeonamesClient('demo')
geonames_result = geonames_client.find_timezone({'lat': 48.871236, 'lng': 2.77928})
print geonames_result['timezoneId']
Output:
'Europe/Paris'
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
With tzwhere and 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)
I was able to do a lookup suitable for my purposes using timezonefinder:
import datetime
import timezonefinder, pytz
tf = timezonefinder.TimezoneFinder()
# From the lat/long, 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)))
There’s a discussion of the methods of timezonefinder and its limitations in the documentation linked from its pypi page.
timezonefinder
and pytz
can be found in the pip
packages of the same name.
I am trying to get the time zones for latitude and longitude coordinates but am having a few problems
The mistakes are probably very basic
I have a table in a database with around 600 rows. Each row contains a lat long coordinate for somewhere in the world
I want to feed these co-ordinates into a function and then retrieve the time zone. The aim being to convert events which have a local time stamp within each of these 600 places into UTC time
I found a blog post which uses a piece of code to derive timezones from geographical coordinates.
When I try to run the code, I get the error geonames is not defined
. I have applied for an account with geonames.
I think I have just saved the function file in the wrong directory or something simple. Can anyone help
#-------------------------------------------------------------------------------
# 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']
This works as expected:
import geonames
geonames_client = geonames.GeonamesClient('demo')
geonames_result = geonames_client.find_timezone({'lat': 48.871236, 'lng': 2.77928})
print geonames_result['timezoneId']
Output:
'Europe/Paris'
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
With tzwhere and 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)
I was able to do a lookup suitable for my purposes using timezonefinder:
import datetime
import timezonefinder, pytz
tf = timezonefinder.TimezoneFinder()
# From the lat/long, 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)))
There’s a discussion of the methods of timezonefinder and its limitations in the documentation linked from its pypi page.
timezonefinder
and pytz
can be found in the pip
packages of the same name.