Преобразование фрейма данных в 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

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


person user442446    schedule 28.11.2010    source источник
comment
Вам нужно преобразовать переменную времени / даты в имена строк фрейма данных, тогда as.xts будет работать. Функция tibble: column_to_rownames (timevar) сделает это за вас.   -  person Simon Woodward    schedule 14.04.2020


Ответы (9)


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

Так сделай что-нибудь вроде

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

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

person Dirk Eddelbuettel    schedule 28.11.2010
comment
Спасибо! Вы мне очень помогли, хотя ответ был такой простой! (Для меня это было неочевидно, потому что я раньше не использовал ни один из пакетов временных рядов и почему-то не получил этого из документации). Но еще раз спасибо! - person user442446; 28.11.2010
comment
Я не думаю, что это все так очевидно, учитывая, что в документе «xts: Extensible Time Series» четко утверждается, что преобразование из data.frame возможно. - person frankc; 28.09.2011
comment
Добавьте меня как еще одного человека, который не думает, что это так четко задокументировано. Но благодаря этому ответу мне удалось выяснить кое-что еще, не имеющее отношения к исходному вопросу. - person atomicules; 05.12.2011
comment
Я действительно не уверен, что здесь можно применить четко задокументированное. Что ясно, так это то, что документация xts - это лабиринт. - person Damien B; 18.07.2012
comment
@DamienB (и другие комментаторы и поддерживающие голосование), мы более чем рады принять участие / исправления, которые делают документацию более понятной и / или менее запутанной. В OSS замечательно то, что вы можете изменить ситуацию (но высказывание своего мнения без каких-либо действий не считается). - person Joshua Ulrich; 10.10.2012
comment
@JoshuaUlrich, пожалуйста, не OSS нас, разница, которую мы здесь делаем, заключается в том, что мы говорим Дирку, что нет, четко задокументированное не применяется, когда вы впервые используете xts, и поскольку это первое использование, а документ не читается, у нас нет идея о том, как сделать его более доступным. В состав документации может внести свой вклад человек, который понял И может вернуться к своему душевному состоянию учащегося. Если мы прокомментируем здесь что-то настолько простое, мы явно не достигли этого уровня, и ваши лекции, безусловно, не помогут. - person Damien B; 12.10.2012
comment
@DamienB: Я никогда не говорил, что это четко задокументировано. Я только сказал, что люди, которые не понимали и не нашли документацию понятной, но которые теперь понимают, могут помочь сделать документацию Чисто. В противном случае вы просите меня представить состояние ума учащегося, чтобы лучше писать документацию. Ваш комментарий о том, что документация - это лабиринт, и ваши лекции бесполезны. - person Joshua Ulrich; 12.10.2012
comment
@JoshuaUlrich лично (даже если это случайно только то, что я был целью @ :-)), я до сих пор не обернулся вокруг xts, и я использовал xts только, потому что он был своего рода объединением десятков примеров временных рядов, и это было понято в ggplot2. Возможность прочитать некоторые данные и, наконец, вывести график, не дает нам уверенности в том, что мы действительно поняли и правильно ли мы поступили. (И читая код, который я написал 4 месяца назад, и не касаясь R между ними, это действительно кажется мне черной магией :-D) - person Damien B; 12.10.2012
comment
@DamienB: Я @ed вас, потому что вы были последним, и вы можете @ только одного человека в комментарии (что отстой). Я счастлив работать с участниками, чтобы помочь им по-настоящему понять, но я не могу представить себе их точку зрения на то, что нуждается в разъяснении. Честные попытки, какими бы несовершенными они ни были, приветствуются (например, см. Xts FAQ по R-Forge, написанный тем, кто задает вопросы). - person Joshua Ulrich; 12.10.2012
comment
@JoshuaUlrich Я даже не могу найти FAQ по r-forge.r- project.org/projects/xts (первый результат с Google for xts FAQ по R-Forge) :) Пока что единственное, что я могу сказать, это мой случай: мне пришлось построить временной ряд с некоторой гибкостью, Раньше я делал это с помощью gnuplot и читал несколько сообщений в блогах о том, насколько крутым был R, поэтому я попробовал. Я не пробовал создавать карты, я не пробовал понять, что такое R, я пробовал, потому что у меня был CSV с отметками времени и мне требовалось 5-минутное агрегирование (в итоге я получил агрегат (qxts, time (qxts) -as. числовое (время (qxts)) %% 300, среднее)). Даже не уверен, где именно xts подходит :) - person Damien B; 12.10.2012
comment
ошибка связана с POSIXlt, но в документации говорится, что xts, помимо прочего, использует POSIXct - person MySchizoBuddy; 06.07.2015

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

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

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

person Dr G    schedule 28.11.2010
comment
Наверное, должно быть: rownames(q) = q[[1]] - person IRTFM; 03.10.2013
comment
@ 42, а какая разница? - person Ahmedov; 03.09.2016
comment
@Ahmedov q[1] будет списком, содержащим вектор. q[[1]] будет просто вектором. Может не иметь значения, если [<-.rownames принимает список, но даже если это так, не все функции присваивания, зависящие от класса, делают это. - person IRTFM; 03.09.2016
comment
Вы можете использовать tibble :: column_to_rownames, чтобы установить имена строк в канале. - person Simon Woodward; 14.04.2020

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

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

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

person Matt Dancho    schedule 02.03.2017
comment
Эта функция устарела. Используйте timetk :: tk_xts вместо rdocumentation.org/packages/tidyquant/ версии / 0.5.3 / темы / - person psychonomics; 21.03.2018

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

library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)
person Gregory Lopez    schedule 04.05.2019
comment
Привет, добро пожаловать в Stack Overflow. Отвечая на вопрос, на который уже есть несколько ответов, не забудьте добавить дополнительную информацию о том, почему ответ, который вы предоставляете, является существенным, а не просто повторением того, что уже было проверено исходным плакатом. Это особенно важно в ответах, содержащих только код, таких как тот, который вы предоставили. - person chb; 04.05.2019

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

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)

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

person AloesR2512    schedule 21.11.2019

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

person AloesR2512    schedule 23.11.2019

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

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

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

library(data.table)

qxts <- as.xts(as.data.table(q))
person James Hirschorn    schedule 18.05.2020

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

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

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

person BatmanFan    schedule 12.09.2020