Получение часового пояса из длинных координат?

Я пытаюсь получить часовые пояса для координат широты и долготы, но у меня есть несколько проблем. Ошибки, вероятно, очень простые.

У меня есть таблица в базе данных около 600 строк. Каждая строка содержит длинную координату широты где-то в мире. Я хочу передать эти координаты в функцию, а затем получить часовой пояс. Цель состоит в том, чтобы преобразовать события, которые имеют отметку местного времени в каждом из этих 600 мест, во время UTC.

Я нашел запись в блоге , в которой используется фрагмент кода для получения часовых поясов из географических координат.

Когда я пытаюсь запустить код, я получаю сообщение об ошибке geonames is not defined. Я подал заявку на учетную запись с геоименами.

Я думаю, что только что сохранил файл функции в неправильном каталоге или что-то простое. Может ли кто-нибудь помочь

#-------------------------------------------------------------------------------
# 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']

person John Smith    schedule 01.04.2013    source источник
comment
Похоже, вы не импортировали geonames. Добавить строку import geonames?   -  person Martijn Pieters    schedule 01.04.2013
comment


Ответы (4)


Это работает так, как ожидалось:

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

Выход:

'Europe/Paris'
person Manuel Riel    schedule 26.10.2014
comment
@manuel_riel, что это за библиотека ... импортировать геоназвания? - person sirvon; 28.03.2016
comment
Просто пакет Python, обертывающий geonames.org. Он находится в Pypi pypi.python.org/pypi/geonames. - person Manuel Riel; 29.03.2016
comment
Пакет, на который вы ссылаетесь, похоже, не имеет класса GeonamesClient. Возможно, вы используете другой пакет? - person waterproof; 07.07.2016
comment
Этот ответ больше недействителен. - person Jwely; 01.08.2019
comment
Упомянутая библиотека не работает под Linux. Код поддерживает только python2, и есть жестко заданные пути Windows. - person maxbit89; 28.05.2020

С tzwhere и 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)
person tuxayo    schedule 12.09.2016
comment
Это работало как автономное решение, в котором мы нуждались. Хотя некоторые могут столкнуться с ошибкой: OSError: Не удалось найти lib geos_c или загрузить какой-либо из ее вариантов при импорте tzwhere. Это помогло: stackoverflow.com/a/23057508/3699126 - person sunsetjunks; 28.03.2017
comment
не работает в mac os x sierra и python 2.7 - person Ciasto piekarz; 31.07.2017
comment
Любая дополнительная деталь? Ошибка сообщения? Можете ли вы попробовать с Python 3? - person tuxayo; 31.07.2017
comment
нет ошибки, возвращается None при вызове метода tzNameAt - person Ciasto piekarz; 02.08.2017
comment
Это сработало для меня в High Sierra и Python 2.7. - person Jan S.; 11.01.2018
comment
@Ciastopiekarz Каковы были аргументы вашего звонка в tzNameAt? Если ты их еще найдешь. Может быть, это нормально, что некоторые координаты заставляют tzNameAt() возвращать None? - person tuxayo; 30.04.2018
comment
Для тех, кто столкнулся с этой ошибкой в ​​Mac OS: AttributeError: объект 'tzwhere' не имеет атрибута 'tzwhere', замените tzwhere = tzwhere.tzwhere() на tz = tzwhere.tzwhere(), используйте timezone_str = tz.tzNameAt(37.3880961, -5.9823299) в следующей строке. - person Trees; 16.06.2020
comment
tzwhere кажется недоступным в Python 3, согласно этот вопрос - person tsherwen; 22.09.2020

Мне удалось выполнить поиск, подходящий для моих целей, с помощью 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))

В документации по ссылке на со страницы pypi обсуждается метод поиска часового пояса и его ограничения.

timezonefinder и pytz можно найти в pip одноименных пакетах.

person rakslice    schedule 13.01.2018
comment
Я не проводил всестороннего тестирования с несколькими входными координатами, поэтому не могу говорить о точности, но с точки зрения скорости timezonefinder намного быстрее, чем tzwhere. По крайней мере, для меня. - person Jim Carr; 02.05.2018

person    schedule
comment
Это прекрасно работает. Однако существуют ли какие-либо ограничения на использование этого веб-сервиса? - person Diansheng; 18.07.2017
comment
Вот что я получил {'status': {'message': 'the daily limit of 20000 credits for demo has been exceeded. Please use an application specific account. Do not use the demo account for your application.', 'value': 18}} :) - person VivienG; 20.07.2020
comment
С python 3.8 для меня ошибка KeyError: 'timezoneId' - person duff18; 15.09.2020