Самый быстрый способ получить часовой пояс из большого набора данных координат (миллион или более) - PullRequest
0 голосов
/ 20 октября 2018

Какой самый быстрый способ получить местный часовой пояс в тексте большого набора данных координат?Мой текущий метод работает нормально, но пакет, который я использую "rundel / timezone" (который прост и отлично подходит для небольших наборов), довольно медленный для больших наборов.

Есть ли более быстрый способ выполнить задачу, воспроизведенную ниже?:

  library(data.table)

#REPRODUCE DATA
  data <- data.table(latitude=sample(seq(47,52,by=0.001), 1000000, replace = TRUE),
                     longitude=sample(seq(8,23,by=0.001), 1000000, replace = TRUE))

  ###get timezone package via rundel/timezone
  if (!require("timezone")) devtools::install_github("rundel/timezone")
  library(timezone)


###CURRENT SLOW METHOD 

system.time(data[,timezone:=find_tz(longitude,latitude),])
       user  system elapsed 
     49.017  21.394  74.086 

1 Ответ

0 голосов
/ 20 октября 2018

Мне удалось найти пакет lutz, когда я увидел этот вопрос.Похоже, этот пакет работает для OP.Я думал, что было бы хорошо оставить здесь записку.В пакете есть функция с именем tz_lookup_coords().С помощью этой функции вы можете настроить метод двумя способами.Один - method = "fast", а другой - method = "accurate".Если вы хотите скорость, выберите первый вариант.Если вы хотите точности, выберите второй вариант.Я оставляю следующий результат.Вы видите огромную разницу во времени.

library(lutz) 
set.seed(111)
data <- data.table(latitude=sample(seq(47,52,by=0.001), 1000000, replace = TRUE),
                   longitude=sample(seq(8,23,by=0.001), 1000000, replace = TRUE))

system.time(data[, timezone := tz_lookup_coords(lat = latitude, lon = longitude, method = "fast")])

#user  system elapsed 
#6.46    3.42    9.92 

#Warning message:
#Using 'fast' method. This can cause inaccuracies in timezones
#near boundaries away from populated ares. Use the 'accurate'
#method if accuracy is more important than speed. 

system.time(data[, timezone := tz_lookup_coords(lat = latitude, lon = longitude, method = "accurate")])

#  user  system elapsed 
#154.44    0.18  154.93 
...