修改POSIXct对象的时区而不更改显示

sta*_*ant 10 timezone r posixct

我有一个POSIXct对象,并希望更改它的tz属性WITHOUT R来解释它(解释它将意味着改变日期时间在屏幕上的显示方式).

一些背景:我正在使用fasttime来自S.Urbanek 的包,它采用字符串并将其POSIXct快速投射.问题是字符串应该代表"GMT"中的日期时间,而不是我的数据的情况.

我最终得到一个POSIXct对象tz=GMT,实际上是tz=GMT+1,如果我改变时区

attr(datetime, "tzone") <- "Europe/Paris";
datetime  <- .POSIXct(datetime,tz="Europe/Paris"); 
Run Code Online (Sandbox Code Playgroud)

然后它将"显示"为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"
Run Code Online (Sandbox Code Playgroud)

如何在没有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
Run Code Online (Sandbox Code Playgroud)

JT8*_*T85 9

要更改变量的tz属性,POSIXct最好不要将其转换为字符或数字,然后再转换为POSIXct.相反,您可以使用包的force_tz功能lubridate

library(lubridate)

datetime2 <- force_tz(datetime, tzone = "CET")
datetime2
attributes(datetime2)
Run Code Online (Sandbox Code Playgroud)

  • 该死的很慢,请看我的编辑! (2认同)

GSe*_*See 9

编辑:

我之前的解决方案是将字符值传递给origin(即origin="1970-01-01").这只能在这里工作,因为一个错误(#PR14973)现在已经在R-devel中得到修复.

origin正被强迫POSIXct使用调用的tz参数as.POSIXct,而不是"GMT"记录在案.行为已更改为与文档相匹配,在这种情况下,这意味着您必须为调用originas.POSIXct调用指定时区.

datetime
#[1] "2011-01-01 12:32:23.233 GMT"
as.POSIXct(as.numeric(datetime), origin=as.POSIXct("1970-01-01", tz="Europe/Paris"),
           tz="Europe/Paris")
#[1] "2011-01-01 12:32:23.233 CET"
Run Code Online (Sandbox Code Playgroud)

这也适用于旧版本的R.

  • 此解决方案对“ GMT”,“欧洲/巴黎”对有效,但对“ E​​ST”,“ UTC”(R-2.15.3、64位,Win7)无效。但是,“ force_tz”给出正确的结果。 (2认同)
  • @cryo111 我明白了。你是对的。这是一种替代方式,它是 lubridate 正在做的事情的一部分,我认为:`x &lt;- as.POSIXlt(datetime); attr(x, "tzone") &lt;- "UTC"; as.POSIXct(x)` (2认同)