Преобразование из `zoo` в` xts` создает множество NA в индексе - PullRequest
3 голосов
/ 09 декабря 2011

У меня довольно странная проблема, которую, вероятно, лучше всего описать на примере сеанса R.Я пытался сделать это воспроизводимым, как просили в комментариях ниже.

meto <- structure(c(30, 25, 25, 25, 20, 20, 20, 20, 20, 20), index = structure(c(12796, 
            12796.0416666667, 12796.0833333333, 12796.125, 12796.1666666667, 
            12796.2083333333, 12796.25, 12796.2916666667, 12796.3333333333, 
            12796.375), format = structure(c("d/m/y", "h:m:s"), .Names = c("dates", 
            "times")), origin = structure(c(1, 1, 1970), .Names = c("month", 
            "day", "year")), class = c("chron", "dates", "times")), class = "zoo")

Пример набора данных выглядит так:

> meto
(13/01/05 00:00:00) (13/01/05 01:00:00) (13/01/05 02:00:00) (13/01/05 03:00:00) (13/01/05 04:00:00) 
                 30                  25                  25                  25                  20 
(13/01/05 05:00:00) (13/01/05 06:00:00) (13/01/05 07:00:00) (13/01/05 08:00:00) (13/01/05 09:00:00) 
                 20                  20                  20                  20                  20 
> str(meto)
‘zoo’ series from (13/01/05 00:00:00) to (13/01/05 09:00:00)
  Data: num [1:10] 30 25 25 25 20 20 20 20 20 20
  Index: Classes 'chron', 'dates', 'times'  atomic [1:10] 12796 12796 12796 12796 12796 ...
  ..- attr(*, "format")= Named chr [1:2] "d/m/y" "h:m:s"
  .. ..- attr(*, "names")= chr [1:2] "dates" "times"
  ..- attr(*, "origin")= Named num [1:3] 1 1 1970
  .. ..- attr(*, "names")= chr [1:3] "month" "day" "year"

Когда мы конвертируем в XTS:

m <- as.xts(meto)

Что приводит к следующему выводу:

> str(m)
An ‘xts’ object from NA to NA containing:
  Data: num [1:10, 1] 30 25 25 25 20 20 20 20 20 20
  Indexed by objects of class: [chron,dates,times] TZ: 
  xts Attributes:  
 NULL
> summary(m)
     Index          m       
 Min.   :NA   Min.   :20.0  
 1st Qu.:NA   1st Qu.:20.0  
 Median :NA   Median :20.0  
 Mean   :NA   Mean   :22.5  
 3rd Qu.:NA   3rd Qu.:25.0  
 Max.   :NA   Max.   :30.0  
 NA's   :10                 
Warning message:
In data.row.names(row.names, rowsi, i) :
  some row.names duplicated: 2,3,4,5,6,7,8,9,10 --> row.names NOT used

Как видите, временной ряд зоопарка содержит много данных, проиндексированных объектами хрон.Тем не менее, когда я преобразую его в xts временной ряд, используя as.xts, все выглядит хорошо для начала ... но команда str показывает NA, а сравнение итогов от meto до m показывает, что болееВ индексе создано 36 000 АН!

Кто-нибудь знает, почему это происходит или что я могу сделать, чтобы решить эту проблему?

1 Ответ

4 голосов
/ 09 декабря 2011

Проблема в том, что ваш индекс имеет класс chron. Я очень мало знаю о chron, но AFAIK, как правило, предпочтительнее использовать объекты даты и времени POSIX в R, т.е. POSIXct или POSIXlt.

Где-то при преобразовании из zoo в xts информация о классе chron уничтожается.

Преобразование вашего индекса в класс POSIXct устраняет проблему.

index(meto) <- as.POSIXct(index(meto)) 
as.xts(meto)

                    [,1]
2005-01-13 00:00:00   30
2005-01-13 01:00:00   25
2005-01-13 01:59:59   25
2005-01-13 03:00:00   25
2005-01-13 04:00:00   20
2005-01-13 04:59:59   20
2005-01-13 06:00:00   20
2005-01-13 07:00:00   20
2005-01-13 07:59:59   20
2005-01-13 09:00:00   20

Для получения дополнительной информации о работе с датами и классами времени R см. ?DateTimeClasses, ?POSIXct или ?strptime - все это ведет на одну и ту же страницу справки.


EDIT

Если xts должен обрабатывать chron объекты при импорте из zoo, вы, вероятно, обнаружили ошибку в функции xts::xts.

Проблема возникает в этой строке:

if (inherits(order.by, "dates")) 
    index <- as.numeric(as.POSIXct(strptime(as.character(order.by), 
        "(%m/%d/%y %H:%M:%S)")))

Но обратите внимание, что формат вашего chron объекта ("d/m/y", "h:m:s") - я знаю это из вашего str(meto). Посмотри внимательно - между днем ​​и месяцем есть смещение.

Это вполне может быть языковой вопрос. Я полагаю, что автор пакета живет в США, где стандартный формат m / d / y, но во многих других местах стандартный формат d / m / y.

Итак, каким-то образом при преобразовании между zoo и xts код преобразования должен корректироваться в соответствии с языком пользователя.

Я предлагаю вам связаться с автором пакета с этой информацией.

...