【发布时间】:2013-03-12 15:02:24
【问题描述】:
我有一个POSIXct 对象,并且想更改它的tz 属性而不用R 来解释它(解释它意味着更改日期时间在屏幕上的显示方式)。
一些背景知识:我正在使用来自 S.Urbanek 的 fasttime 包,它可以非常快速地将字符串转换为 POSIXct。问题是字符串应该代表“GMT”中的日期时间,而我的数据不是这样。
我最终得到一个带有tz=GMT 的POSIXct 对象,如果我用
attr(datetime, "tzone") <- "Europe/Paris";
datetime <- .POSIXct(datetime,tz="Europe/Paris");
那么它将被“显示”为GMT+2(基础值永远不会改变)。
编辑:这是一个例子
datetime=as.POSIXct("2011-01-01 12:32:23.234",tz="GMT")
attributes(datetime)
#$tzone
#[1] "GMT"
datetime
#[1] "2011-01-01 12:32:23.233 GMT"
如何在没有 R 的情况下更改此属性来解释它,也就是如何更改 tzone 并仍然将日期时间显示为 "2011-01-01 12:32:23.233" ?
编辑/解决方案,@GSee 的解决方案相当快,lubridate::force_tz 非常慢
datetime=rep(as.POSIXct("2011-01-01 12:32:23.234",tz="GMT"),1e5)
f <- function(x,tz) return(as.POSIXct(as.numeric(x), origin="1970-01-01", tz=tz))
> system.time(datetime2 <- f(datetime,"Europe/Paris"))
user system elapsed
0.01 0.00 0.02
> system.time(datetime3 <- force_tz(datetime,"Europe/Paris"))
user system elapsed
5.94 0.02 5.98
identical(datetime2,datetime3)
[1] TRUE
【问题讨论】:
-
lubridate::force_tz -
新用户应注意,您不能在 data.frame 的单个列中拥有多个时区。
-
请注意,您的函数
f与@GSee 的最新答案不对应,因为起源不一定相同。当我用你的f做f(datetime[1], tz="Europe/Paris")时,我得到2011-01-01 13:32:23 CET。所以在f我认为你应该有origin = as.POSIXct("1970-01-01", tz=tz)。此外,force_tz现在似乎更快了。