是否有一种简单的方法可以将时区偏移量添加到现有时间戳(全部为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
答案 0 :(得分:1)
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
列中的文本字符串转换为小时和分钟跨度。但由于函数忽略了正负号,我们必须将小时/分钟变量乘以符号。我假设,如在示例中,每个偏移都有正号或负号。
答案 1 :(得分:0)
基本上有两种方式:
首先,在格式化步骤中应用时区:
R> t <- Sys.time()
R> sapply(c("America/New_York","America/Los_Angeles"),function(tz) format(t,tz=tz))
America/New_York America/Los_Angeles
"2015-09-02 15:34:28" "2015-09-02 12:34:28"
R>
你所期望的三小时差异。
其次,这更加苛刻,只需按秒移动:
R> sapply(seq(-60,60,60), function(dt) format(t+dt*60, tz="America/New_York"))
[1] "2015-09-02 14:34:28" "2015-09-02 15:34:28" "2015-09-02 16:34:28"
R>
由于您不需要解析,因此比您的方法更清晰。
最后,像xts
这样的时间序列容器允许您设置TZ属性,这是我通常对实际数据所做的。