2011-08-31 9 views
7

Zajmuje się wyodrębnianiem danych z bazy danych i uruchamianiem wyników przez rehsape2. Z jakiegoś powodu jest to zniekształcanie POSIXct datetime znaczków na numeryczne. Nie ma problemu. Myślę, że możesz po prostu je wyłączyć, z wyjątkiem tego, że jestem godzinę drogi.Konwersja czasu daty w POSIXct daje efekt śrubowy?

Oto minimalne przykład

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" 

Oczywiście foo i bar są numerycznie identyczne, ale R myśli foo musi być wyświetlany jako BST i baru jako UTC. Jak uzyskać oba wyświetlane jako BST. To też nie działa;

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

Odpowiedz

13

Oto, co się dzieje. bar jest tworzony przy użyciu as.POSIXct.numeric, który jest zdefiniowany jako:

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

można dostarczyć pochodzenia, który jest POSIXct przedmiot. Oznacza to, że połączenie as.POSIXct w as.POSIXct.numeric wysyłek do as.POSIXct.default, który jest zdefiniowany jako:

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> 

x jest obiektem POSIXct klasa (the origin Ci dostarczane w początkowej rozmowy), więc to jest po prostu wrócił i tz= argument jest ignorowane.


UPDATE:
Oto jak można przekonwertować foo z powrotem do POSIXct z odpowiedniej strefy czasowej.

(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 Za pokazanie, co się dzieje – Andrie

+1

Brilliant. Dziękujemy za dodanie aktualizacji. – PaulHurleyuk

2

Tu jest szlam, którego użyłem, aby to obejść. Określając początek jako bieżący czas minus numeryczną wersję bieżącego czasu, strefy czasowe nie wydają się być wkręcane.

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

Źle zrozumiałem, co chciałeś. Zaktualizowałem swoją odpowiedź za pomocą rozwiązania, które może okazać się mniej roztrzepane. –

Powiązane problemy