Преобразование времени UT C в местное время в R с использованием широты и долготы - PullRequest
1 голос
/ 05 августа 2020

У меня есть фрейм данных в R со следующей структурой:

df <- data.frame(
long = c(-112, 34, 39), 
lat = c(41, -92, -76), 
state=c("utah", "arkansas", "maryland"), 
utc_time = c(1593855055, 1593826821, 1593826447)
)

      long      lat    state      utc_time <br>
1     -112       41     utah     1593855055 <br>
2       34      -92  arkansas    1593826821 <br>
3       39      -76  maryland    1593826447 <br>
<br>  

Я хотел бы преобразовать utc_time в местное время, используя lat, long или код состояния. Я понятия не имею, с какого времени исходная марка ut c, но похоже, что GMT.

Мысли? Спасибо.

Обновление:

Спасибо, MrFlick. Да, это было полезно. Пока я не мог заставить работать пакет часовых поясов. Я использовал прилагаемый файл формы и произвел пространственное соединение.

TZ <- st_read("shape file from http://efele.net/maps/tz/us/")
df <- st_as_sf(df, coords = c("long", "lat"), crs = st_crs(TZ))
df <- st_join(df, TZ)

Теперь у меня есть фрейм данных, который выглядит следующим образом:

df <- data.frame(
TZID = c("America/New_York", "America/Denver", "America/New_York"), 
utc_time = c(1593855055, 1593826821, 1593826447)
)

Я все еще пытаюсь получить R для распознайте это как местное время:

df$date <- as.POSIXct(df$utc_time, tz=TZID)

Я не знаю, неправильно ли я векторизирую или неправильно понимаю команду POSIXct. Тем не менее, я нашел ваш ответ чрезвычайно полезным. Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Вот более базовый способ R (уточняющий мой комментарий выше). После получения часовых поясов по координатам

tz <- lutz::tz_lookup_coords(df$lat, df$long, method="accurate")

вы можете использовать Map, который дает вам список времени с разными часовыми поясами.

tmp <- Map(function(x, tz, ...) 
  as.POSIXct(x, tz, ...), df$utc_time, tz, origin="1970-01-01")
# [[1]]
# [1] "2020-07-04 03:30:55 MDT"
# 
# [[2]]
# [1] "2020-07-03 20:40:21 CDT"
# 
# [[3]]
# [1] "2020-07-03 21:34:07 EDT"

Вы можете добавить время как символ к фрейму данных

df$local.time <- sapply(tmp, as.character)
#   lat long    state   utc_time               tz          local.time
# 1  41 -112     utah 1593855055   America/Denver 2020-07-04 03:30:55
# 2  34  -92 arkansas 1593826821  America/Chicago 2020-07-03 20:40:21
# 3  39  -76 maryland 1593826447 America/New_York 2020-07-03 21:34:07

Данные:

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

df <- structure(list(lat = c(41, 34, 39), long = c(-112, -92, -76), 
    state = c("utah", "arkansas", "maryland"), utc_time = c(1593855055, 
    1593826821, 1593826447)), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 05 августа 2020

Вот возможное решение, использующее lutz для поиска часового пояса, затем некоторую функцию из lubridate для преобразований.

library(lutz)
library(dplyr)
library(tidyr)
library(purrr)
library(lubridate)

Ваши данные, отредактированные так, чтобы они были правильными:

df <- data.frame(
  long = c(-112, -92, -76), 
  lat = c(41, 34, 39), 
  state = c("utah", "arkansas", "maryland"), 
  utc_time = c(1593855055, 1593826821, 1593826447)
)

Теперь обработайте данные.

df %>% 
  mutate(utc_dt   = as_datetime(utc_time),
         tz       = map2_chr(lat, long, tz_lookup_coords, method = "accurate"),
         local_dt = pmap(list(utc_dt, tz), with_tz)) %>% 
  unnest(local_dt)

Это предполагает, что utc_dt - секунды с эпохи UNIX. Затем мы сопоставляем широту и долготу функции tz_lookup_coords, которая возвращает часовой пояс. Затем мы сопоставляем UT C datetime и часовой пояс с функцией with_tz, которая возвращает локальное datetime. Столбец является столбцом списка, поэтому нам нужно unnest, чтобы вернуть значение.

Результат:

# A tibble: 3 x 7
   long   lat state      utc_time utc_dt              tz               local_dt           
  <dbl> <dbl> <chr>         <dbl> <dttm>              <chr>            <dttm>             
1  -112    41 utah     1593855055 2020-07-04 09:30:55 America/Denver   2020-07-04 03:30:55
2   -92    34 arkansas 1593826821 2020-07-04 01:40:21 America/Chicago  2020-07-03 19:40:21
3   -76    39 maryland 1593826447 2020-07-04 01:34:07 America/New_York 2020-07-03 19:34:07
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...