Преобразование фрейма данных в XTS

Я пытаюсь преобразовать фрейм данных в объект 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

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

11 ответов

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

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

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

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

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

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

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

Вот решение с использованием 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 объект с правильной датой или датой-временем в качестве имен строк.

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

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

Причина, по которой это не сработало, теперь кажется ясной: xts не принимает тибблы, и даже если столбцы выбраны, они все равно сохраняются как тибблы. Либо данные керна могут быть преобразованы в матрицу или вектор. Работает следующий код:xls.tbl <- xls(tbl$x, order.by = tbl$t)

Простое решение - сначала преобразовать data.frame к data.table:

library(data.table)

qxts <- as.xts(as.data.table(q))

Я определил индекс, длина которого равна количеству строк в моем тибле. Только после определения временной последовательности отдельно, как показано в примере:

ti= seq(from = ymd_hm("2000-01-01 00:00"),
to = ymd_hm("2000-01-02 01:00"), by =  "30 min", tz = "UTC")

tbl <- tibble(t =ti,
    x = 1:length(t))
)

Этот код работал:

xts.tbl <- xts(tbl[,-1], order.by = ti)

Однако все данные превратились в символы.

Попробуйте следующее

q$t<-as.xts(q, order.by = as.Date(q$t), dateFormat="POSIXct")

Используйте read.zoo, а затем as.xts. Этот:

  • не требует каких-либо дополнительных пакетов, кроме тех, которые уже используются
  • использует целостный объектный подход, избегая работы с внутренними компонентами q

Код--

      library(xts) # also pulls in zoo
as.xts(read.zoo(q))

Я тоже столкнулся с этим, но мой формат даты данных был немного другим: гггг-мм-дд, в отличие от OP, который типичен для финансовых данных, которые вы загружаете в R.
конкретно, например: "2022-02-28".
В результате все предложенные решения не работают.
Что работает:

as.xts(q, order.by=as.Date(rownames(q), format = "%Y%m%d"))

предполагая, что ваши данные находятся в типичном фрейме данных с датами в виде имен строк (если нет, просто замените q соответствующим образом на столбец данных и даты)

Вы можете просто сделать следующее

qxts <- xts(q[,2],q$t)

Работал у меня.

Другие вопросы по тегам