2011-08-31 68 views
7

我正在做一些从数据库中提取数据,并通过rehsape2运行结果。出于某种原因,这会将POSIXct日期时间戳戳损坏为数字。没问题我想,你可以把他们退回来,除了我一个小时外。在POSIXct中转换日期时间给出了棘手的结果?

这里的一个小例子

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), 
       tz=Sys.timezone(), 
       origin=as.POSIXct(
        strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC"))) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 13:18:58 UTC" 

显然foo和bar在数值上相同,但认为řfoo的需要被显示为BST和酒吧为UTC。我怎样才能同时显示为BST。这也不管用;

as.POSIXct(bar, tz="BST") #still gives "2011-04-04 13:18:58 UTC" 

回答

13

以下是发生了什么事情。 bar使用as.POSIXct.numeric,其被定义为创建的:

as.POSIXct.numeric 
function (x, tz = "", origin, ...) 
{ 
    if (missing(origin)) 
     stop("'origin' must be supplied") 
    as.POSIXct(origin, tz = tz, ...) + x 
} 
<environment: namespace:base> 

你提供的原点是一个POSIXct对象。这意味着as.POSIXct呼叫as.POSIXct.numeric分派给as.POSIXct.default,其定义为:

as.POSIXct.default 
function (x, tz = "", ...) 
{ 
    if (inherits(x, "POSIXct")) 
     return(x) 
    if (is.character(x) || is.factor(x)) 
     return(as.POSIXct(as.POSIXlt(x, tz, ...), tz, ...)) 
    if (is.logical(x) && all(is.na(x))) 
     return(.POSIXct(as.numeric(x))) 
    stop(gettextf("do not know how to convert '%s' to class \"POSIXct\"", 
     deparse(substitute(x)))) 
} 
<environment: namespace:base> 

xPOSIXct类对象(origin你在初始呼叫提供的),所以它简单地返回,并且tz=说法是忽略。


UPDATE:
下面是你可以转换fooPOSIXct与适当的时区。

(foo <- as.POSIXct("2011-04-04 14:18:58", tz="GB")) 
# [1] "2011-04-04 14:18:58 BST" 
.POSIXct(as.numeric(foo), tz="GB") 
# [1] "2011-04-04 14:18:58 BST" 
+1

+1为了显示发生了什么 – Andrie

+1

辉煌。感谢您添加更新。 – PaulHurleyuk

2

这是我用来解决这个问题的混乱。通过将原点指定为当前时间减去当前时间的数字版本,时区似乎不会被搞砸。

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), tz="GB", origin=Sys.time()-as.numeric(Sys.time())) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST 
+0

我误解了你的意思。我更新了我的答案,并提供了一个您可能会发现不那么乱七八糟的解决方案。 –