使用纬度和经度转换为本地时区时间?

7

我有一个数据集,其中包含以下信息:纬度、经度、东部标准时间。例如,对于一次观测

lat = 13
long = -2
time1 = as.POSIXlt("2014-02-12 17:00:00", tz = "EST")

我想创建一个名为timeL的新变量,表示本地时间。有什么建议可以使用R进行操作吗?

谢谢!

2个回答

14
lat = 13
long = -2
time1 <- as.POSIXct("2014-02-12 17:00:00", tz = "EST")
# https://developers.google.com/maps/documentation/timezone/
apiurl <- sprintf("https://maps.googleapis.com/maps/api/timezone/%s?location=%s,%s&timestamp=%d&sensor=%s", 
                  "xml", 
                  lat, 
                  long, 
                  as.numeric(time1), 
                  "false")
library(XML)
tz <- xmlParse(readLines(apiurl))[["string(//time_zone_id)"]]
as.POSIXct(format(time1, tz=tz))
# [1] "2014-02-12 22:00:00 CET"

或者,根据@SymbolixAU的建议,使用他们的googleway包:

res <- googleway::google_timezone(c(lat, long), time1, key = NULL)
as.POSIXct(format(time1, tz=res$timeZoneId))
# [1] "2014-02-12 22:00:00 CET"

2
我的 googleway 包中还有 API 封装器 google_timezone(),可以避免自己解析 XML。 - SymbolixAU
为什么我的 lat = 114 时,tz = ""? - Claudia
@Claudia 你期望的时区是什么? - lukeA
嗨,我尝试了你的解决方案,但出现了问题,输出是GMT,即使我的坐标是Lat - 3,Lon 160。我已经尝试了两种解决方案:time1 <- as.POSIXct("2015-10-30 03:50:00", tz = "UTC") res <- googleway::google_timezone(c(-3, 162), time1, key = NULL) as.POSIXct(format(time1, tz=res$timeZoneId)) - Paperwing

4
另一种方法是将目标点坐标与全球时区的shapefile相交,然后将EST时间戳转换为每个空间点的当地时间。例如,世界时区的边界可从时区边界生成器直接下载)获取。
library(sf)

## example data
dat = data.frame(lon = -2
                 , lat = 13
                 , time1 = as.POSIXlt("2014-02-12 17:00:00", tz = "EST"))

## convert to 'sf' object
sdf = st_as_sf(dat, coords = c("lon", "lat"), crs = 4326)

## import timezones (after extraction) and intersect with spatial points
tzs = st_read("timezones.geojson/combined.json", quiet = TRUE)
sdf = st_join(sdf, tzs)

## convert timestamps to local time
sdf$timeL = as.POSIXlt(sdf$time1, tz = as.character(sdf$tzid))
sdf$timeL
# [1] "2014-02-12 22:00:00 GMT"

请注意,相应的时区Africa/Ouagadougou是格林威治标准时间。

你可以使用 st_join 而不是完整的 st_intersection(只需在代码中替换)将时区属性连接到点上。对于这个例子来说可能不相关,但是对于更大的数据集和点与多边形查询,st_join 通常比 st_intersection 更快,并且产生相同的结果。 - TimSalabim
同意,感谢您指出这一点。请参阅GitHub上的Vectorize st_intersection问题。 - fdetsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接