Изменить индексацию даты объекта xts

У меня есть два файла данных с возвратом акций. Я пытаюсь применить одну и ту же функцию к обоим, но получаю сообщение об ошибке для одного из них. Я хотел выяснить, что вызывает ошибку, поэтому я сравнил вывод str для обоих объектов xts, и единственная строка, которая отличается:

Indexed by objects of class: [POSIXct,POSIXt] TZ: # this object errors
Indexed by objects of class: [Date] TZ: GMT       # this object works

Есть ли способ изменить индексацию дат в объекте xts, чтобы вывод str возвращал: Indexed by objects of class: [Date] TZ: GMT?

Я сгенерировал даты, используя: seq(as.Date("1963/07/01"), as.Date("2004/12/01"), by = "1 month",tzone="GMT").

Воспроизводимый пример:

library(xts)
library("PerformanceAnalytics")
load("https://dl.dropboxusercontent.com/u/22681355/data.Rdata")
data(edhec)
data2 <- as.xts(french1)

Функция, которую я хочу вызвать, это Return.portfolio() с аргументом rebalance_on="months".

Return.portfolio(edhec["1997",1:10],rebalance_on="months") #this works
Return.portfolio(data2["1976",1:10],rebalance_on="months") #this does not work

person user1984076    schedule 09.07.2015    source источник
comment
Можете ли вы предоставить воспроизводимый пример и функцию, выдающую ошибку? Если вы не можете предоставить функцию, выдающую ошибку, можете ли вы хотя бы сказать нам, что это за ошибка? Ваш текущий вопрос предполагает, что вы знаете причину ошибки, что может быть неверным предположением.   -  person Joshua Ulrich    schedule 09.07.2015
comment
Пожалуйста, смотрите мое редактирование. Теперь есть полный воспроизводимый пример.   -  person user1984076    schedule 09.07.2015
comment
Обычно функции is возвращают логическое значение, тогда как функции as действуют для принуждения объектов.   -  person IRTFM    schedule 09.07.2015
comment
Ваш пример воспроизводим только в том смысле, что можно запустить код. В верхней части вашего вопроса есть два фрагмента вывода str(), но неясно, какие объекты проверялись. Вероятно, вы написали is.xts, когда хотели написать as.xts, но до сих пор остается загадкой, какую дальнейшую обработку вы могли выполнить с этим результатом seq.Date().   -  person IRTFM    schedule 10.07.2015


Ответы (1)


xts:::as.xts.data.frame по умолчанию предполагает, что имена строк вашего data.frame должны быть приведены к объекту/индексу POSIXct. Если вы хотите использовать другой класс, укажите его через аргумент dateFormat= для as.xts.

> data2 <- as.xts(french1, dateFormat="Date")
> str(data2)
An ‘xts’ object on 1963-06-30/2004-11-30 containing:
  Data: num [1:498, 1:10] -0.47 4.87 -1.68 2.66 -1.13 2.83 0.79 1.85 3.08 -0.45 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:10] "NoDur" "Durbl" "Manuf" "Enrgy" ...
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
 NULL

Хотя я не уверен, что это является причиной любой ошибки, с которой вы сталкиваетесь, потому что я не получаю сообщение об ошибке без указания dateFormat="Date".

> data2 <- as.xts(french1)
> Return.portfolio(data2["1976",1:10],rebalance_on="months")
           portfolio.returns
1976-01-31         0.3980000
1976-02-29         0.1017811
1976-03-31         1.3408273
1976-04-30       -11.7395151
1976-05-31         8.0197492
1976-06-30        -0.2550812
1976-07-31         2.5732207
1976-08-31         1.3784635
1976-09-30        -1.6859705
1976-10-31       -21.4958124
1976-11-30         5.6863828
1976-12-31        -7.8071966
Warning message:
In Return.portfolio(data2["1976", 1:10], rebalance_on = "months") :
  weighting vector is null, calulating an equal weighted portfolio
person Joshua Ulrich    schedule 09.07.2015
comment
странно, потому что без аргумента даты в as.xts() я получаю сообщение об ошибке, но после добавления dateformat=Date он работает без ошибки. - person user1984076; 10.07.2015