在 R 中转换时区日期
Converting timeszone dates in R
所以我有一个数据框如下:
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")
而且我可以“成功”为每个日期生成 sunrise/sunset 次:
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)
)
但现在我输了AM/PM。
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 在纽约时间吐出的日期。
一个选项是转换为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
所以我有一个数据框如下:
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")
而且我可以“成功”为每个日期生成 sunrise/sunset 次:
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)
)
但现在我输了AM/PM。
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 在纽约时间吐出的日期。
一个选项是转换为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