Преобразование времени даты в POSIXct дает странный результат? - PullRequest
7 голосов
/ 31 августа 2011

Я занимаюсь извлечением данных из базы данных и запускаю результаты через rehsape2. По некоторым причинам это искажает метки даты и времени 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 нужно отображать как BST, а bar как UTC. Как мне отобразить оба BST. Это тоже не работает;

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

Ответы [ 2 ]

13 голосов
/ 31 августа 2011

Вот что происходит.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>

x - это объект класса POSIXct (origin, который вы указали в вашемначальный вызов), поэтому он просто возвращается, а аргумент tz= игнорируется.


ОБНОВЛЕНИЕ:
Вот как можно преобразовать foo обратно в POSIXct с соответствующим часовым поясом.

(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"
2 голосов
/ 31 августа 2011

Вот клудж, который я использовал, чтобы обойти это.При указании источника в качестве текущего времени минус числовая версия текущего времени, кажется, что часовые пояса не запутались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...