关于python:从Lat Long Coordinates获取时区?

Getting Time Zone from Lat Long Coordinates?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试获取纬度和经度坐标的时区,但我遇到了一些问题
错误可能是非常基本的

我在数据库中有一个表,大约有600行。 每行包含世界某处的lat长坐标
我想将这些坐标提供给一个函数,然后检索时区。 目的是将这600个地点中每个地点都有本地时间戳的事件转换为UTC时间

我发现了一篇博文,它使用一段代码从地理坐标中导出时区。

当我尝试运行代码时,我得到错误geonames is not defined。 我申请了一个地理名称帐户。

我想我刚刚将函数文件保存在错误的目录或简单的东西中。 谁能帮忙

1
2
3
4
5
6
7
8
9
#-------------------------------------------------------------------------------
# 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']


使用tzwhere和pytz:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)


我能够使用timezonefinder进行适合我的目的的查找:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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))

讨论了timezonefinder的方法及其对pypi页面的限制。

timezonefinderpytz可以在同名的pip包中找到。


这按预期工作:

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

输出:

1
'Europe/Paris'


1
2
3
4
5
6
7
8
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