本文翻译自:xts: Extensible Time Series Jeffrey A. Ryan Joshua M. UlrichMay 18, 2008
在xts出现之前,R语言有很多种时间序列类型,这对最终的用户来说是不方便的。因为,用户需要写与类型相关的函数。不同的时间序列类型之间还需要转换,而这种转换有时候又会损失数据的完整性。
在xts出现之前,quantmod中的chartSeries函数只能接受zoo类型的对象。
xts出现之后,上面的问题得到了解决,没有任何地方需要显示处理xts类型,但是xts类型的对象却在一直被使用。大大降低了终端用户的负担。
xts使得用户可以增加任意属性信息到时间序列对象中。
内核包括一列用户数据,通常是矩阵存储;一个属性索引,用来排序;
1 基于时间的索引:为了让xts用起来和普通的时间序列对象一样,xts对象的索引必须是一个已知的时间或者日期对象。比如Date, POSIXct, chron, yearmon, yearqtr,
or timeDate。其中前三种可以满足大多数的应用场景。
2 独有的属性:为了能够支持from转换和to转换,内部属性都是可转换的。
3 用户增加的属性:用户可以任意增加或者删除自定义的属性而不影响对象的显示或者其他用途。这些属性的存储也是和其他对象之间互相转换的基础和依据。
使用xts包最好的例子莫过于将普通时间序列对象转换为xts对象,或者是用xts的构造函数创建xts对象了。
目前可以将任何时间序列类型转换为xts类型,这些类型包括:matrix, data.frame, ts, zoo, irts, timeSeries.
这些对象在转换成xts类型之后再转换回原来的类型不会损失任何信息
下面的例子都是将时间序列对象转换为xts的示例,从代码中可以详细的看出转换的过程和结果
> library("xts")
> require(xts)
> data(sample_matrix)
> class(sample_matrix)
[1] "matrix"
> str(sample_matrix)
num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:180] "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" ...
..$ : chr [1:4] "Open" "High" "Low" "Close"
> matrix_xts<-as.xts(sample_matrix,dateFormat = 'Date')
> str(matrix_xts)
An ‘xts’ object on 2007-01-02/2007-06-30 containing:
Data: num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "Open" "High" "Low" "Close"
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
NULL
> df_xts<-as.xts(as.data.frame(sample_matrix),important="very important info!")
> str(df_xts)
An ‘xts’ object on 2007-01-02/2007-06-30 containing:
Data: num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "Open" "High" "Low" "Close"
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
List of 1
$ important: chr "very important info!"
如果一个类型没有足够的信息能够说明其实一个时间序列对象,那么转换到xts类型的时候将会使用默认的POSIXct类型作为索引类型(比如matrix和data.frame对象)。
> xts_obj<-xts(1:10,Sys.Date()+1:10)
> xts_obj
[,1]
2017-08-16 1
2017-08-17 2
2017-08-18 3
2017-08-19 4
2017-08-20 5
2017-08-21 6
2017-08-22 7
2017-08-23 8
2017-08-24 9
2017-08-25 10
> str(xts_obj)
An ‘xts’ object on 2017-08-16/2017-08-25 containing:
Data: int [1:10, 1] 1 2 3 4 5 6 7 8 9 10
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
NULL
> xts_obj<-xts(1:5,Sys.Date()+1:5)
> xts_obj
[,1]
2017-08-23 1
2017-08-24 2
2017-08-25 3
2017-08-26 4
2017-08-27 5
> length(xts_obj)
[1] 5
> names(xts_obj)<-"num"
> xts_obj<-transform(xts_obj,num2 = num+1)
> xts_obj
num num2
2017-08-23 1 2
2017-08-24 2 3
2017-08-25 3 4
2017-08-26 4 5
2017-08-27 5 6
> length(xts_obj)
[1] 10
> length(index(xts_obj))
[1] 5
matrix_xts['2007-03']
提取从开始到截止时间为2007-01-07的全部数据
matrix_xts['/2007-01-17']
matrix_xts[index(matrix_xts) > as.Date('20070405','%Y%m%d')]
> sample_matrix[1]
[1] 50.03978
> sample_matrix[1,1]
[1] 50.03978
> # using xts-style subsetting doesn't work on non-xts objects
> sample_matrix['2007-06']
[1] NA
> sample_matrix['2007-06-22']
[1] NA
> sample_matrix[1]
[1] 50.03978
> sample_matrix[1,1]
[1] 50.03978
first(matrix_xts,'1 week')
最后一周的前3天数据
first(last(matrix_xts,'1 week'),'3 days')
> indexClass(matrix_xts)
[1] "Date"
> indexClass(convertIndex(matrix_xts,'POSIXct'))
[1] "POSIXct" "POSIXt"
> buyIndex
[1] 30
> s[buyIndex]
Open High Low Close Volume Adjusted
2015-01-13 14.03 14.93 13.82 14.47 4899856 86904992
> data(sample_matrix)
>
> endpoints(sample_matrix)
[1] 0 30 58 89 119 150 180
> endpoints(sample_matrix, 'weeks')
[1] 0 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119 126 133 140
[22] 147 154 161 168 175 180
> dt<-xts(1:10,Sys.Date()+1:10)
> dt
[,1]
2017-08-21 1
2017-08-22 2
2017-08-23 3
2017-08-24 4
2017-08-25 5
2017-08-26 6
2017-08-27 7
2017-08-28 8
2017-08-29 9
2017-08-30 10
> index(dt)
[1] "2017-08-21" "2017-08-22" "2017-08-23" "2017-08-24" "2017-08-25" "2017-08-26"
[7] "2017-08-27" "2017-08-28" "2017-08-29" "2017-08-30"
> str(attributes(df_xts))
List of 9
$ dim : int [1:2] 180 4
$ dimnames :List of 2
..$ : NULL
..$ : chr [1:4] "Open" "High" "Low" "Close"
$ index : atomic [1:180] 1.17e+09 1.17e+09 1.17e+09 1.17e+09 1.17e+09 ...
..- attr(*, "tzone")= chr ""
..- attr(*, "tclass")= chr [1:2] "POSIXct" "POSIXt"
$ .indexCLASS: chr [1:2] "POSIXct" "POSIXt"
$ tclass : chr [1:2] "POSIXct" "POSIXt"
$ .indexTZ : chr ""
$ tzone : chr ""
$ important : chr "very important info!"
$ class : chr [1:2] "xts" "zoo"
> attr(df_xts,'important')
[1] "very important info!"
> attr(df_xts,'important')<-"very important info!+1"
> attr(df_xts,'important')
[1] "very important info!+1"
plot(matrix_xts[,1],major.ticks='months',minor.ticks=FALSE,main=NULL,col=3) #main=NULL 表示不设置图标的标题 col=3表示颜色为3号颜色
> library(quantmod)
> chart_Series(matrix_xts)
> chart_Series(to.period(matrix_xts,'weeks'))
> chart_Series(to.period(matrix_xts,'months'))