是否有一种简单的方法可以将时区偏移量添加到现有时间戳(全部采用 UTC)?
为简单起见,我使用 Sys.time()
在我的示例中,但在实际数据中,我做 DF$ts <- as.POSIXct(..., tz="GMT")
.
DF <- data.frame("ts" = rep(Sys.time(), 5),
"offset"=c("-11:00", "-12:00", "+01:30", "+02:00", "+02:30"))
# > DF
# ts offset
# 1 2015-09-02 14:35:31 -11:00
# 2 2015-09-02 14:35:31 -12:00
# 3 2015-09-02 14:35:31 +01:30
# 4 2015-09-02 14:35:31 +02:00
# 5 2015-09-02 14:35:31 +02:30
现在我正在进行字符串操作,但我认为这并不优雅。例如,
offsetSeconds <- function(offset) {
time <- as.numeric(strsplit(offset, ":")[[1]])
seconds <- time[1] * 3600 + sign(time[1]) * time[2] * 60
return(seconds)
}
DF$seconds <- as.numeric(sapply(as.character(DF$offset), offsetSeconds))
DF$local_ts <- DF$ts + DF$seconds
# > DF
# ts offset seconds local_ts
# 1 2015-09-02 14:35:31 -11:00 -39600 2015-09-02 03:35:31
# 2 2015-09-02 14:35:31 -12:00 -43200 2015-09-02 02:35:31
# 3 2015-09-02 14:35:31 +01:30 5400 2015-09-02 16:05:31
# 4 2015-09-02 14:35:31 +02:00 7200 2015-09-02 16:35:31
# 5 2015-09-02 14:35:31 +02:30 9000 2015-09-02 17:05:31
最佳答案
library(lubridate)
signs <- as.numeric(paste0(substr(DF$offset, 1, 1), "1"))
DF$ts + hm(DF$offset)*signs
#[1] "2015-09-02 04:06:17 EDT" "2015-09-02 03:06:17 EDT"
#[3] "2015-09-02 16:36:17 EDT" "2015-09-02 17:06:17 EDT"
#[5] "2015-09-02 17:36:17 EDT"
使用 lubridate 包中的函数 hm
,我们可以将 offset
列中的文本字符串转换为小时和分钟范围。但是由于函数忽略了正负号,我们必须将小时/分钟变量乘以符号。我假设,如示例中所示,每个偏移量都有一个正号或负号。
关于R 将时区偏移量添加到 POSIXct 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360948/