2012-05-13 2 views
3

У меня есть xts объект с indexClass "Date". index(data) дает мне объект «POSIXct». Я думал, что index(Data) вернет объект «Дата».R: index() не может вернуть желаемый класс

Как я могу получить объект «Дата» от index()?

str(data) 
An ‘xts’ object from 2007-01-15 to 2012-04-27 containing: 
    Data: num [1:1282, 1:5] 1881 2003 2064 2026 2098 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "open" "high" "low" "close" ... 
    Indexed by objects of class: [Date] TZ: GMT 
    xts Attributes: 
List of 2 
$ tclass: chr "Date" 
$ tzone : chr "GMT" 

indexClass(data) 
"Date" 

str(index(data)) 
Class 'POSIXct' atomic [1:1282] 1.17e+09 1.17e+09 1.17e+09 1.17e+09 1.17e+09 ... 
    ..- attr(*, "tzone")= chr "GMT" 
    ..- attr(*, "tclass")= chr "Date" 
+1

Следуя моему ответу ниже, у меня есть вопрос: как di d Вы создаете свои данные ?! Я не могу понять, как добавить часовой пояс к индексу xts, когда это Date. (Мне интересно, если indexDate (x) предоставляет объект Date Date без времени, но поскольку я не могу воспроизвести вашу проблему, я не могу проверить это.) –

+0

Я полагаю, что переменная TZ теперь сохраняется в атрибуте tzone при создании xts объекты. Если нам не нужен атрибут tzone, как его удалить? – user1589

+0

Я отредактировал свой ответ, чтобы показать, что явно установка tzone не имеет никакого значения. Можете ли вы изменить свой вопрос, чтобы показать, как вы создаете «данные», у которых есть проблема, пожалуйста. Держите его минимальным, но он должен быть достаточно полным, чтобы мы могли воспроизвести проблему. –

ответ

1

Быстрый ответ: Даты не имеют временных зон. Поэтому (я полагаю), чтобы сохранить информацию о часовом поясе, вы должны обернуть свою дату в POSIXct.

Вот пример без часовых поясов, где он показывает поведение вы ожидаете:

x=xts(1:10, seq.Date(as.Date('2012-01-01'),by=1,length.out=10)) 
indexClass(x) 
# [1] "Date" 
index(x) 
# "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06" "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" 
str(index(x)) 
# Date[1:10], format: "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06" "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" 

UPDATE: Добавление атрибута tzone к объекту XTS ничего не меняет:

x=xts(1:10, seq.Date(as.Date('2012-01-01'),by=1,length.out=10), tzone="GMT") 
str(index(x)) 
# Date[1:10], format: "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06" "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" 

Это несмотря на то, что str (x) дает тот же результат, что и вы:

An ‘xts’ object from 2012-01-01 to 2012-01-10 containing: 
    Data: int [1:10, 1] 1 2 3 4 5 6 7 8 9 10 
    Indexed by objects of class: [Date] TZ: GMT 
    xts Attributes: 
List of 2 
$ tclass: chr "Date" 
$ tzone : chr "GMT"