2011-08-31 63 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

我誤解了你的意思。我更新了我的答案,並提供了一個您可能會發現不那麼亂七八糟的解決方案。 –

相關問題