【问题标题】:Converting UTC time to Local Time in R using Lat and Long使用 Lat 和 Long 将 UTC 时间转换为 R 中的本地时间
【发布时间】:2020-11-25 04:38:16
【问题描述】:

我在 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)
)

长纬度状态 utc_time
1 -112 41 犹他州 1593855055
2 34 -92 阿肯色州 1593826821
3 39 -76 马里兰州 1593826447

我想使用 lat、long 或州代码将 utc_time 转换为本地时间。我不知道原始 utc 戳是什么时间,但似乎很可能是 GMT。

想法? 谢谢。

更新:

谢谢弗利克先生。是的,这很有帮助。虽然我无法让时区包工作。我确实使用了随附的形状文件并进行了空间连接。

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 命令。尽管如此,我发现您的回答非常有帮助。谢谢。

【问题讨论】:

  • 你能提供更好的示例数据吗?纬度不能为 -112。
  • 试试Reduce(c, Map(function(x, tz, ...) as.POSIXct(x, tz, ...), df$utc_time, df$TZID, origin="1970-01-01"))

标签: r timestamp utc lubridate


【解决方案1】:

这是一个可能的解决方案,使用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,它返回时区。然后我们将 UTC 日期时间和时区映射到函数 with_tz,它返回本地日期时间。该列是一个列表列,所以我们需要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

【讨论】:

    【解决方案2】:

    这是一种更基本的 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))
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2018-07-27
      • 2023-03-31
      • 2020-06-12
      • 2014-07-18
      • 2021-02-04
      • 2010-09-15
      相关资源
      最近更新 更多