从 UTC 时间获取本地时间

ATM*_*TMA 2 time timezone r latitude-longitude data.table

假设我有一个包含日期、纬度和经度的数据集。

dt = data.table(date = c("2017-10-24 05:01:05",
                         "2017-10-24 05:01:57", 
                         "2017-10-24 05:02:54"),
                lat = c(-6.2704925537109375,
                        -6.2704925537109375,
                        -6.2704925537109375),
                long = c(106.5803680419922, 
                         106.5803680419922,
                         106.5803680419922))
Run Code Online (Sandbox Code Playgroud)

时间是UTC。是否可以使用纬度和经度将该 UTC 传输到本地时间?

Flo*_*ian 5

我发现转换经度和纬度时区一个很好的答案在这里,所以这里是我们如何可以应用方法的使用情况。

library(data.table)
library(googleway)
library(lubridate)
dt = data.table(date = c("2017-10-24 05:01:05",
                         "2017-10-24 05:01:57", 
                         "2017-10-24 05:02:54"),
                lat = c(-6.2704925537109375,
                        -6.2704925537109375,
                        -6.2704925537109375),
                long = c(106.5803680419922, 
                         106.5803680419922,
                         106.5803680419922))

dt$date <- with_tz(as.POSIXct(dt$date), "UTC")

convert_time <- function(lat,lon,time_x)
{
  my_time <- google_timezone(c(lat, lon), key = NULL)
  as.POSIXct(format(time_x, tz=my_time$timeZoneId)) 
}

dt[,time_conv:=convert_time(lat,long,date),by=1:nrow(dt)]
Run Code Online (Sandbox Code Playgroud)

输出:

                  date       lat     long           time_conv
1: 2017-10-24 03:01:05 -6.270493 106.5804 2017-10-24 10:01:05
2: 2017-10-24 03:01:57 -6.270493 106.5804 2017-10-24 10:01:57
3: 2017-10-24 03:02:54 -6.270493 106.5804 2017-10-24 10:02:54
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


重要笔记:

  • 请参阅下面的 SymbolixAU 评论。尽管从技术上讲您不需要,但根据Google 的要求,您应该请求一个 API 密钥并在google_timezone()上面的函数中使用它。
  • Google API 有一定的使用限制。如果您打算在大型数据帧上执行此操作,请考虑仅对唯一的经纬度对进行子集化,甚至可能将它们四舍五入为x数字。然后,您可以应用google_timezone()这些独特的组合,然后将它们合并回原始dataframe.