2011-08-31 2 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数値的に同じであるが、RはfooがUTCとしてBSTとバーとして表示する必要があります考えています。両方をBSTとして表示するにはどうしたらいいですか?これはどちらもうまくいかない。

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

答えて

13

ここでは何が起こっているのですか。あなたはPOSIXctオブジェクトである起源を供給

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

barは次のように定義されas.POSIXct.numericを使用して作成されます。それは、次のように定義されてas.POSIXct.defaultからas.POSIXct.numeric派遣でas.POSIXct呼び出し、意味:

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:
は、ここでは、適切なタイムゾーンにPOSIXctfooバックを変換することができます方法です。

(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

私はあなたが望むものを誤解しました。私は答えが見つからないかもしれない解決策で私の答えを更新しました。 –

関連する問題