【问题标题】:Converting timeszone dates in R在 R 中转换时区日期
【发布时间】:2020-07-13 19:51:47
【问题描述】:

所以我有一个如下的数据框:

dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
"2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")

我可以“成功”为每个日期生成日出/日落时间,具体如下:

library(httr)
library(jsonlite)

dates %>% 
  rowwise() %>% 
  mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[1]),
         sunset = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[2])
  )

因此:

    
Date            sunrise     sunset
2018-01-03  12:19:53 PM 9:41:13 PM
2018-01-03  12:19:53 PM 9:41:13 PM
2018-01-04  12:19:52 PM 9:42:08 PM
2018-01-08  12:19:27 PM 9:46:00 PM
2018-01-09  12:19:15 PM 9:47:01 PM

然而,这里的问题是日期是 UTC(我相信)。我在这里的位置是纽约市,所以以上这些时间提前 4 小时。我写了以下内容来解决这个问题,但我认为我把这些时间推迟了 4 小时已经过于复杂了。

library(data.table)
dates %>% 
  rowwise() %>% 
  mutate(sunrise = as.character(as.ITime(as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[1])
           )-18000),
         sunset = as.character(as.ITime(as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[2])
         )-18000)
         )

但现在我已经失去了上午/下午。

Date         sunrise    sunset
2018-01-03  07:19:53  04:41:13
2018-01-03  07:19:53  04:41:13
2018-01-04  07:19:52  04:42:08
2018-01-08  07:19:27  04:46:00
2018-01-09  07:19:15  04:47:01

简而言之,我怎样才能完成这项工作,以便获得 API 在纽约时间吐出的日期。

【问题讨论】:

  • 您可能需要format format(as.POSIXct("04:41:13", format = '%H:%M:%S'), format = "%I:%M:%S %p")

标签: r api time dplyr lubridate


【解决方案1】:

一个选项是转换为POSIXct,然后转换为format

dates %>% 
   rowwise() %>% 
   mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[1]),
          sunset = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[2])
   ) %>%
   mutate(sunrise = toupper(format(as.POSIXct(sunrise, format = "%I:%M:%S %p") - 18000, "%I:%M:%S %p")))
# A tibble: 5 x 3
# Rowwise: 
#  Date       sunrise     sunset    
#  <chr>      <chr>       <chr>     
#1 2018-01-03 07:19:53 AM 9:41:13 PM
#2 2018-01-03 07:19:53 AM 9:41:13 PM
#3 2018-01-04 07:19:52 AM 9:42:08 PM
#4 2018-01-08 07:19:27 AM 9:46:00 PM
#5 2018-01-09 07:19:15 AM 9:47:01 PM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2015-07-30
    • 2022-11-13
    • 2019-10-24
    相关资源
    最近更新 更多