Как удалить часовой пояс из временной метки POSIXct для преобразования в XTS? - PullRequest
0 голосов
/ 19 февраля 2020

По какой-то причине, когда я преобразую данные своего временного ряда из фрейма данных в объект xts, часовой пояс включается в индекс. Я подозреваю, что это проблема, когда я пытаюсь запустить моделирование временных рядов на объекте, потому что я продолжаю получать ошибки. Когда я go проверяю структуру объекта xts, данные внутри объекта xts каким-то образом преобразуются в chr. Они должны быть num, какими они были до преобразования. Вот некоторые данные:

full_timestamp             PRICE
2015-01-02 10:02:27.389055  85.4
2015-01-02 10:03:30.926059  85.3
2015-01-02 10:04:52.231750  85.4
2015-01-02 10:05:37.139763  85.5
2015-01-02 10:06:54.926069  85.5
2015-01-02 10:07:57.253187  85.3

Вот структура фрейма данных:

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   89026 obs. of  2 variables:
 $ full_timestamp: POSIXct, format: "2015-01-02 10:02:27.389055" "2015-01-02 10:03:30.926059" "2015-01-02 10:04:52.231750" ...
 $ PRICE         : num  85.4 85.3 85.4 85.5 85.5 ...

Код, который я использовал для преобразования метки времени из символьного вектора в метку времени POSIXct:

testing_eq_4xts$full_timestamp <- as.POSIXct(strptime(testing_eq_4xts$full_timestamp, 
                                                      format = "%Y-%m-%d:%H:%M:%OS",
                                                      tz = ""))

Я пытался включить tz = "", вообще не включать часть tz и даже Sys.unsetenv("TZ"), чтобы остановить преобразование, выбирающее часовой пояс. Я также должен подчеркнуть, что мне нужна гранулярность в метке времени для того, что я моделирую. Вот код, который я использую для преобразования в xts:

testing_eq_xts <- as.xts(testing_eq_4xts[, names(testing_eq_4xts) != "full_timestamp"],
                  order.by = testing_eq_4xts$full_timestamp, unique = F)

, и вот как выглядит структура:

An ‘xts’ object on 2015-01-02 10:02:27.389055/2015-12-31 14:37:07.969814 containing:
  Data: num [1:89026, 1] 85.4 85.3 85.4 85.5 85.5 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "PRICE"
  Indexed by objects of class: [POSIXct,POSIXt] TZ: 
  xts Attributes:  
 NULL

также индекс xts:

[1] "2015-01-02 10:02:27.389055 AEDT" "2015-01-02 10:03:30.926059 AEDT"
[3] "2015-01-02 10:04:52.231750 AEDT" "2015-01-02 10:05:37.139763 AEDT"

Оставить отметку времени в виде символьного вектора и попытаться преобразовать ее в POSIXct при преобразовании в xts также не работает, используя:

testing_eq_xts2 = xts(testing_eq_4xts[, 2], as.POSIXct(testing_eq_4xts[, 1]))

дает эту ошибку:

Error in as.POSIXct.default(testing_eq_4xts[, 1]) : 
  do not know how to convert 'testing_eq_4xts[, 1]' to class “POSIXct”

Нахожусь ли я на правильном пути, почему PRICE было преобразовано в chr в объекте xts, и если да, то как мне это исправить? Если я ошибаюсь в своих предположениях, то что мне нужно сделать, чтобы это исправить? Спасибо.

1 Ответ

0 голосов
/ 19 февраля 2020

Вы уже выяснили, что значение 'tz' иногда "", но если вы посмотрите на ?strptime, вы увидите, что использование tz="" действительно говорит об использовании вашего текущего часового пояса, который будет извлечен из вашей системы. настройки. Вместо этого вы должны использовать tz="GMT" (при условии, что UTC / UCT - это то, что вы имеете в виду, когда говорите «нет часового пояса».) В действительности нет никакого способа иметь «нет часового пояса», поскольку время всегда измеряется в каком-то часовом поясе или другом .

И ... вы не можете иметь столбец POSIXct в объекте xts (или zoo) (и, вероятно, также не в символьном значении, поскольку вы обычно ожидаете, что объект xts будет содержать числовые значения c) , Это потому, что объекты xts и zoo на самом деле являются R-матрицами и не могут содержать столбцы с атрибутами. Поскольку объекты POSIXct на самом деле удваиваются (секунды с момента возникновения) с атрибутом класса 'POSIXct', они не могут быть элементами в матрицах xts или zoo. (Это могут быть индексы xts, потому что для этой части структуры существуют разные правила.)

 myxts <- as.xts(read.csv.zoo(text="full_timestamp,             PRICE
 2015-01-02 10:02:27.389055,  85.4
 2015-01-02 10:03:30.926059,  85.3
 2015-01-02 10:04:52.231750,  85.4
 2015-01-02 10:05:37.139763,  85.5
 2015-01-02 10:06:54.926069,  85.5
 2015-01-02 10:07:57.253187,  85.3", sep=",", index=1, tz="GMT"))
 myxts
#-----------------
                    [,1]
2015-01-02 10:02:27 85.4
2015-01-02 10:03:30 85.3
2015-01-02 10:04:52 85.4
2015-01-02 10:05:37 85.5
2015-01-02 10:06:54 85.5
2015-01-02 10:07:57 85.3
Warning message:
timezone of object (GMT) is different than current timezone (). 

 dput(myxts)
#-------------
structure(c(85.4, 85.3, 85.4, 85.5, 85.5, 85.3), .Dim = c(6L, 
1L), index = structure(c(1420192947.38906, 1420193010.92606, 
1420193092.23175, 1420193137.13976, 1420193214.92607, 1420193277.25319
), tzone = "GMT", tclass = c("POSIXct", "POSIXt")), class = c("xts", 
"zoo"))

 index(myxts)
 #--------------
[1] "2015-01-02 10:02:27 GMT" "2015-01-02 10:03:30 GMT" "2015-01-02 10:04:52 GMT"
[4] "2015-01-02 10:05:37 GMT" "2015-01-02 10:06:54 GMT" "2015-01-02 10:07:57 GMT"
...