r-如何从POSIXct时间戳中删除时区以转换为XTS



由于某种原因,当我将时间序列数据从数据帧转换为xts对象时,时区包含在索引中。当我试图在对象上运行时间序列建模时,我怀疑这就是问题所在,因为我一直会出错。当我去检查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"

将时间戳保留为字符向量,并在转换为xts时尝试将其转换为POSIXct也不起作用,使用:

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”

我是否正确理解了为什么在xts对象中将PRICE转换为chr,如果是,我该如何修复它?如果我的假设不正确,那么我需要做什么来解决这个问题?谢谢

您已经发现"tz"值有时是",但如果查看?strptime,您会发现使用tz=""实际上是在使用您的当前时区,该时区将从您的系统设置中提取。您应该使用tz="GMT"(假设UTC/UCT是您所说的"无时区"的意思。(实际上没有"无时区的",因为时间总是在某个时区或另一个时区测量的。

而且。。。在xts(或zoo(对象中不能有POSIXct列(可能也不是字符值,因为您通常希望xts对象包含数值(。这是因为xtszoo对象实际上是R矩阵,它们不能包含具有属性的列。由于POSIXct对象实际上是类属性为"POSIXct"的双对象(自原点算起的秒数(,因此它们不能是xts或zoo矩阵中的元素。(它们可以是xts-index,因为结构的这一部分有不同的规则。(

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"

最新更新