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)
要更改变量的tz
属性,POSIXct
最好不要将其转换为字符或数字,然后再转换为POSIXct
.相反,您可以使用包的force_tz
功能lubridate
library(lubridate)
datetime2 <- force_tz(datetime, tzone = "CET")
datetime2
attributes(datetime2)
Run Code Online (Sandbox Code Playgroud)
我之前的解决方案是将字符值传递给origin
(即origin="1970-01-01"
).这只能在这里工作,因为一个错误(#PR14973)现在已经在R-devel中得到修复.
origin
正被强迫POSIXct
使用调用的tz
参数as.POSIXct
,而不是"GMT"
记录在案.行为已更改为与文档相匹配,在这种情况下,这意味着您必须为调用origin
和as.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.