XTS слияния странное поведение - PullRequest
3 голосов
/ 06 октября 2011

У меня есть 3 объекта xts, все признаки которых являются объектами 'Date':

    > a
                  a
    1995-01-03 1.76
    1995-01-04 1.69
    > b
                  b
    1995-01-03 1.67
    1995-01-04 1.63
    > c
                   c
    1995-01-03 1.795
    1995-01-04 1.690

Для проверки одинаковы индексы:

    > index(a) == index(b)
    [1] TRUE TRUE
    > index(a) == index(c)
    [1] TRUE TRUE

Теперь я вижу странное поведение:

    > merge.xts(a,b)
                  a    b
    1995-01-03   NA 1.67
    1995-01-03 1.76   NA
    1995-01-04   NA 1.63
    1995-01-04 1.69   NA

Пока следующее слияние отлично работает:

    > merge.xts(a,c)
                  a     c
    1995-01-03 1.76 1.795
    1995-01-04 1.69 1.690

Я не могу понять, что здесь может происходить. Есть идеи?

Обновление:

    > dput(a)
    structure(c(1.76, 1.69), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts", 
    "zoo"), index = structure(c(789168240, 789254580), tzone = "", tclass = "Date"), .Dim = c(2L, 
    1L), .Dimnames = list(NULL, "a"))

    > dput(b)
    structure(c(1.67, 1.63), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts", 
    "zoo"), index = c(789109200, 789195600), .Dim = c(2L, 1L), .Dimnames = list(
        NULL, "b"))

    > dput(c)
    structure(c(1.795, 1.69), .indexCLASS = "Date", .indexTZ = "", .CLASS = "xts", class = c("xts", 
    "zoo"), index = c(789109200, 789195600), .Dim = c(2L, 1L), .Dimnames = list(
        NULL, "c"))

Действительно, проблема в том, что индексы не идентичны (как проверено .index(a) == .index(b)). Преобразование в числовое значение, затем воссоздание xts и повторное вычисление дат с asDate устранило проблему.

Эти объекты были созданы методом to.daily из xts.

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Конечно, это кажется запутанным, но причина в том, что Дата неточна. Все, что в течение календарного дня, совпадает с «датой».

Где-то, как упоминал Джош, есть тот факт, что ваши данные создаются разными способами / источниками. Я попытаюсь придумать лучший способ управления этой изменчивостью - поскольку это не совсем новая проблема. До тех пор:

index(x) <- index(x) 

сделает свое дело. Почему?

Как отмечает Джош, index(x) [no <-] берет базовое представление POSIX time_t и преобразует его в Date (дни с начала эпохи). Замена исходного индекса с помощью index<- преобразует «Дата» обратно во время POSIX (POSIXct в R, time_t в C)

 t1 <- Sys.time()
 t2 <- Sys.time()

 as.Date(t1) == as.Date(t2)
 #[1] TRUE

 t1 == t2
 #[1] FALSE


 x1 <- xts(1, t1)
 x2 <- xts(2, t2)


 indexClass(x1) <- "Date"
 indexClass(x2) <- "Date"
 cbind(x1,x2)
            ..1 ..2
 2011-10-06   1  NA
 2011-10-06  NA   2

 .index(cbind(x1,x2))
 [1] 1317925443 1317925447
 attr(,"tzone")
 [1] "America/Chicago"
 attr(,"tclass")
 [1] "Date"

 # ugly, ugly solution
 index(x1) <- index(x1)
 index(x2) <- index(x2)
 cbind(x1,x2)
            ..1 ..2
 2011-10-06   1   2
 .index(cbind(x1,x2))
 [1] 1317877200
3 голосов
/ 06 октября 2011

Вы не можете использовать index() для проверки того, что индексы одинаковы, потому что он конвертирует индекс во все, что указано indexClass().Используйте .index для получения необработанного числового индекса, тогда вы, вероятно, обнаружите, что:

all(.index(a) == .index(b))  # is FALSE

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

index(b) <- as.Date(index(b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...