Преобразование фрейма данных в 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)
Работал у меня.