Преобразование фрейма данных в XTS - PullRequest
47 голосов
/ 28 ноября 2010

Я пытаюсь преобразовать фрейм данных в объект xts, используя метод as.xts (). Вот мой входной фрейм данных q:

q
                      t x  
1  2006-01-01 00:00:00  1  
2  2006-01-01 01:00:00  2  
3  2006-01-01 02:00:00  3

str(q)
    'data.frame':   10 obs. of  2 variables:
 $ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ...  
 $ x: int  1 2 3 4 5 6 7 8 9 10

Результат:

> as.xts(q)
Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

Это самый простой пример, который я могу придумать, поэтому очень неприятно, что он не работает ... Любая помощь приветствуется!

Ответы [ 4 ]

74 голосов
/ 28 ноября 2010

Это четко задокументировано --- xts и zoo объекты формируются путем предоставления двух аргументов, vector или matrix, несущих данные и Date, POSIXct, chron, ... введите информацию о времени (или в случае zoo порядок).

Так что-то вроде

 qxts <- xts(q[,-1], order.by=q[,1])

и вы должны быть установлены.

18 голосов
/ 28 ноября 2010

Что ж, as.xts предполагает по умолчанию, что даты хранятся в именах строк data.frame. Отсюда и сообщение об ошибке. Быстрое и грязное исправление:

rownames(q) = q[1]
as.xts(q)

Но вы получите дополнительный столбец со строкой дат. В идеале вы должны построить data.frame с датами в качестве имен строк для начала.

6 голосов
/ 02 марта 2017

Вот решение с использованием пакета tidyquant, который содержит функцию as_xts(), которая приводит фрейм данных к объекту xts. Он также содержит as_tibble() для приведения объектов xts к tibbles («аккуратным» фреймам данных).

Создайте заново фрейм данных (обратите внимание, что класс «дата-время» используется в «аккуратных» фреймах данных, но можно использовать любой однозначный класс даты или времени-даты):

> q
# A tibble: 3 × 2
                    t     x
               <dttm> <dbl>
1 2006-01-01 00:00:00     1
2 2006-01-01 01:00:00     2
3 2006-01-01 02:00:00     3

Используйте as_xts() для преобразования в класс "xts". Укажите аргумент date_col = t, чтобы указать столбец «t» в качестве даты для использования в качестве имени строки:

> library(tidyquant)
> as_xts(q, date_col = t)
                    x
2006-01-01 00:00:00 1
2006-01-01 01:00:00 2
2006-01-01 02:00:00 3

Возвращаемое значение - это xts объект с правильной датой или датой в качестве имен строк.

0 голосов
/ 04 мая 2019

Вот возможное решение:

library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)
...