R 更改POSIXct对象中的时区

R 更改POSIXct对象中的时区,r,datetime,R,Datetime,在R中玩dateTimes和timezone可能很棘手。 这里是我的问题:我想更改POSIXct对象上的时区 R) data <- data.frame(x=c(1,2),dateTime=as.POSIXct(c("2010-03-11 03:30:00.432","2010-03-15 03:30:00.432"),format="%Y-%m-%d %H:%M:%S",tz="America/Montreal")) R) data x dateTime 1 1

在R中玩dateTimes和timezone可能很棘手。 这里是我的问题:我想更改
POSIXct
对象上的时区

R) data <- data.frame(x=c(1,2),dateTime=as.POSIXct(c("2010-03-11 03:30:00.432","2010-03-15 03:30:00.432"),format="%Y-%m-%d %H:%M:%S",tz="America/Montreal"))
R) data
  x            dateTime
1 1 2010-03-11 03:30:00
2 2 2010-03-15 03:30:00
R) str(data)
'data.frame':   2 obs. of  2 variables:
 $ x       : num  1 2
 $ dateTime: POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"

上帝(或其他人)知道为什么它不能与
POSIXct

R) data$dateTime2 = as.POSIXct(data$dateTime,tz="Europe/Paris")
R) str(data)
'data.frame':   2 obs. of  3 variables:
 $ x        : num  1 2
 $ dateTime : POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
 $ dateTime2: POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"

我是否需要转换为
字符
并返回到
POSIXct

它不适用于
POSIXct
,因为
base::as.POSIXct.default
如果它已经是
POSIXct
,只返回
x
。您可以通过
tzone
属性更改时区:

attr(data$dateTime, "tzone") <- "Europe/Paris"

attr(data$dateTime,“tzone”)在
lubridate
包中,有一个函数
带有_tz
,它改变了时区属性(约书亚所描述的)


还有一个setter函数
indexTZ()
也可以这样做:
indexTZ(data$dateTime)
.POSIXct(data$dateTime,tz=“Europe/Paris”)
也可以这样做,但它是一个.Internal函数,所以可能不应该在CRAN包中使用。@DirkEddelbuettel:这是为了更改xts对象的时区,不是POSIXct对象。啊哈!POSIXct和POSIXlt对象具有“tzone”属性,下游进程使用它的方式不同。请注意,如果
dateTime
data.table
列,则应使用
setattr(data$dateTime,'tzone',Europe/Paris')
因为
attr
force_tz
lubridate
包中也是一个有用的功能。当您从文件中读取数据并且系统假定某个时区时,此功能非常有用<代码>强制时间
更改时区而不更改时钟时间。
R) data$dateTime2 = as.POSIXct(data$dateTime,tz="Europe/Paris")
R) str(data)
'data.frame':   2 obs. of  3 variables:
 $ x        : num  1 2
 $ dateTime : POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
 $ dateTime2: POSIXct, format: "2010-03-11 03:30:00" "2010-03-15 03:30:00"
attr(data$dateTime, "tzone") <- "Europe/Paris"
dttm <- as.POSIXct("2016-01-01 10:10:10", tz = "UTC")
dttm
[1] "2016-01-01 10:10:10 UTC"
with_tz(dttm, "CET")
[1] "2016-01-01 11:10:10 CET"