更改POSIXct对象中的时区

sta*_*ant 40 datetime r

在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"
Run Code Online (Sandbox Code Playgroud)

但如果我想改变时区,我唯一发现的是:

R) data$dateTime2 = format(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: chr  "2010-03-11 09:30:00" "2010-03-15 08:30:00"
Run Code Online (Sandbox Code Playgroud)

要么

R) data$dateTime2 = as.POSIXlt(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: POSIXlt, format: "2010-03-11 09:30:00" "2010-03-15 08:30:00"
Run Code Online (Sandbox Code Playgroud)

上帝(或者某个人)知道为什么它不起作用 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"
Run Code Online (Sandbox Code Playgroud)

我需要转换character并转换回来POSIXct吗?

Jos*_*ich 49

它不起作用,POSIXct因为它已经base::as.POSIXct.default完全返回xPOSIXct.您可以通过tzone属性更改时区:

attr(data$dateTime, "tzone") <- "Europe/Paris"
Run Code Online (Sandbox Code Playgroud)

  • `.POSIXct(data $ dateTime,tz ="Europe/Paris")`也是这样做的,但它是一个.Internal函数,因此它不应该在CRAN包中使用_probably_. (4认同)
  • 注意,如果`dateTime`是`data.table`列,你应该使用`setattr(data $ dateTime,'tzone','Europe/Paris')`因为`attr <-`会无意中创建`data`的副本 (3认同)
  • @DirkEddelbuettel:这是为了更改 xts 对象的时区,而不是 POSIXct 对象。 (2认同)

Mar*_*ann 22

lubridate包中有一个函数with_tz可以改变时区属性(实际上是Joshua所描述的).

dttm <- as.POSIXct("2016-01-01 10:10:10", tz = "UTC")
dttm
[1] "2016-01-01 10:10:10 UTC"
Run Code Online (Sandbox Code Playgroud)

将时区更改UTCCET

with_tz(dttm, "CET")
[1] "2016-01-01 11:10:10 CET"
Run Code Online (Sandbox Code Playgroud)

  • `force_tz`在`lubridate`包中也是一个有用的函数.从文件读取数据并且系统假定某个时区时很有用.`force_tz`在不改变时钟时间的情况下改变时区. (9认同)