zoo是時(shí)間序列的基礎(chǔ)庫格粪,而xts在zoo基礎(chǔ)上進(jìn)行了拓展骂铁,其對(duì)日期的處理較zoo更為精細(xì)。
zoo = matrix + index
xts = vector + matrix + attributed
即xts由三部分組成彩倚。
1.索引部分:時(shí)間類型向量
2.數(shù)據(jù)部分:以矩陣為基礎(chǔ)類型,支持可以與矩陣相互轉(zhuǎn)換的任何類型
3.屬性部分:附件信息摔蓝,包括時(shí)區(qū),索引時(shí)間類型的格式等
一愉耙、安裝xts包
> install.packages("xts")
二贮尉、時(shí)間類型數(shù)據(jù)
在學(xué)習(xí)xts之前,需要先了解時(shí)間類型數(shù)據(jù)朴沿。
- 在R語言里面有兩個(gè)基本的函數(shù):as.POSIXlt() 和 as.POSIXct()可以把表示時(shí)間的字符串轉(zhuǎn)化為時(shí)間類型數(shù)據(jù)猜谚。
> myDataTimeStr = "2013-12-19 10:17:07" #此時(shí)數(shù)據(jù)類型為character
> class(myDataTimeStr)
[1] "character"
> myPOSIXct = as.POSIXct(myDataTimeStr) #雖然表現(xiàn)形式一樣,但通過class()可知已完成數(shù)據(jù)類型轉(zhuǎn)換
> class(myPOSIXct)
[1] "POSIXct" "POSIXt"
*注意:一周是按0到6開始的赌渣,0是星期日
- datetime的默認(rèn)格式是“yyyy-mm-dd hh:mm:ss”或“yyyy/mm/dd hh:mm:ss”魏铅。
若要改變時(shí)間表達(dá)格式,可以使用format = "..."
> myPOSIXct1 = as.POSIXct("19-12-2003 10:17:07",format = "%d-%m-%Y %H:%M:%S")
> myPOSIXct1
[1] "2003-12-19 10:17:07 CST"
- “POSIXct”對(duì)象有一個(gè)內(nèi)部表示坚芜,它是來自某個(gè)起始datetime的秒數(shù)览芳,我們也可以從數(shù)值數(shù)據(jù)中創(chuàng)建它們。
> myPOSIXct2 = as.POSIXct(0,origin = "1970-01-01")
> myPOSIXct2
[1] "1970-01-01 08:00:00 CST"
> as.numeric(myPOSIXct2)
[1] 0
> myPOSIXct2 = as.POSIXct(0,origin = "1970-01-02")
> myPOSIXct2
[1] "1970-01-02 08:00:00 CST"
> as.numeric(myPOSIXct2)
[1] 86400
請(qǐng)注意鸿竖,因?yàn)椤癈ST”(中國標(biāo)準(zhǔn)時(shí)間)比“gm/UTC”時(shí)間晚8個(gè)小時(shí)沧竟,所以日期顯示為“1970-01-01 08:00 CST”。
- 在許多情況下缚忧,最好在“GMT(UTC)”中定義datetimes悟泵,以避免在處理datetimes時(shí)出現(xiàn)時(shí)區(qū)問題。
> as.POSIXct("1960-01-01",tz = "GMT")
[1] "1960-01-01 GMT"
- 可以使用
Sys.setenv(TZ = "UTC")
來設(shè)置系統(tǒng)市區(qū)到“GMT(UTC)”搔谴,使其變?yōu)槟J(rèn)時(shí)區(qū)魁袜。
但如果你想再轉(zhuǎn)到“CST”(中國標(biāo)準(zhǔn)時(shí)間),使用Sys.setenv(TZ = "CST")
是無效的敦第,這是因?yàn)镃ST有四種不同的含義峰弹。建議可以用Sys.setenv(TZ = "Asia/Shanghai")
,或者使用ISOdatetime()
函數(shù)芜果。
> myPOSIXct3 = ISOdatetime(year=2013,month=12,day=19,hour=10,min=17,sec=7,tz = "")
> class(myPOSIXct3)
[1] "POSIXct" "POSIXt"
> myPOSIXct3
[1] "2013-12-19 10:17:07 CST"
- 時(shí)間數(shù)據(jù)的加減
> myPOSIXct2
[1] "1970-01-02 08:00:00 CST"
> myPOSIXct4 = myPOSIXct2 - 8*60*60
> myPOSIXct4
[1] "1970-01-02 CST"
- 當(dāng)前時(shí)間
> Sys.time()
三鞠呈、xts基礎(chǔ)內(nèi)容
1. 構(gòu)建xts
> library(xts)
> dates <- seq(as.Date("2016-01-01"),length = 5,by = "days")
> dates
[1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05"
> data <- rnorm(5) #隨機(jī)生成五個(gè)數(shù)字
> smith <- xts(x = data,order.by = dates)
> smith
[,1]
2016-01-01 -1.92935732
2016-01-02 0.47103271
2016-01-03 1.15349653
2016-01-04 0.85077517
2016-01-05 0.05895633
2. 解構(gòu)xts
當(dāng)使用時(shí)間序列時(shí),有時(shí)需要將您的時(shí)間序列分離到其核心數(shù)據(jù)和索引屬性中右钾,以進(jìn)行額外的分析和操作蚁吝。核心數(shù)據(jù)是“xts”的矩陣部分。您可以使用coredata()
將其與“xts”對(duì)象分隔開舀射。xts對(duì)象的索引部分可用index()
函數(shù)來獲得窘茁。
> hayek_core <- coredata(hayek)
> class(hayek_core)
[1] "matrix"
> hayek_index <- index(hayek)
> class(hayek_index)
[1] "Date"
3. 取出時(shí)間1至?xí)r間2之間的數(shù)據(jù)
> x <- as.xts(x) #將x從zoo變?yōu)閤ts
> x_2016 <- x["2016"] #提取2016年的數(shù)據(jù)
> jan_march <- x["2016-01-01/2016-03-22"] #提取2016年1月1日至3月22日的數(shù)據(jù)
#提取某幾天的數(shù)據(jù)
> dates <- as.Date(c("2016-06-04","2016-06-08"))
> thedata <- x[dates]
4. 提取最后幾天的數(shù)據(jù)
使用last()
和first()
函數(shù)
> temp.max <- c(74,78,79,80,90,89,87,89,81,83,93,89,86,89,75,79)
> temp.mean <- c(69,66,68,76,79,78,80,73,72,81,82,78,80,72,69,77)
> temp.min <- c(60,56,59,69,68,70,72,72,67,64,69,77,68,68,60,60)
> temps <- xts(cbind(temp.max,temp.mean,temp.min),order.by = as.Date("2017-07-01")+0:15)
> lastweek <- last(temps,"1 week") #提取最后一周的數(shù)據(jù)
> lastweek
temp.max temp.mean temp.min
2017-07-10 83 81 64
2017-07-11 93 82 69
2017-07-12 89 78 77
2017-07-13 86 80 68
2017-07-14 89 72 68
2017-07-15 75 69 60
2017-07-16 79 77 60
> last(lastweek,2) #提取最后一周的最后兩天的數(shù)據(jù)
temp.max temp.mean temp.min
2017-07-15 75 69 60
2017-07-16 79 77 60
> first(lastweek,"-2 days") #提取最后一周除開始兩天以外的數(shù)據(jù)
temp.max temp.mean temp.min
2017-07-12 89 78 77
2017-07-13 86 80 68
2017-07-14 89 72 68
2017-07-15 75 69 60
2017-07-16 79 77 60
> first(last(first(temps,"2 weeks"),"1 week"),"3 days") #提取第二周前三天的數(shù)據(jù)
temp.max temp.mean temp.min
2017-07-03 79 68 59
2017-07-04 80 76 69
2017-07-05 90 79 68
5. 結(jié)合多個(gè)時(shí)間序列
使用merge()
函數(shù)。注意dataframe不能直接使用merge()
脆烟。
> merge(x, y, join = "inner") #以x山林,y都有的時(shí)間為準(zhǔn)
> merge(x, y, join = "left", fill = 0) #以x的時(shí)間為準(zhǔn),y空缺部分補(bǔ)0
> merge(x, y, join = "right") #以y的時(shí)間為準(zhǔn)
6. 滯后時(shí)間序列&先行時(shí)間序列
創(chuàng)造一個(gè)x的先行一期時(shí)間序列:
> lead_x <- lag(x, k = -1)
創(chuàng)造一個(gè)x的滯后一期時(shí)間序列:
> lag_x <- lag(x, k = 1)
7. 差分
一階差分邢羔,即x(t)-x(t-k)可以通過diff()
得到驼抹。
#Calculate the first order 12 month difference of AirPass
> diff(AirPass, lag = 12, difference = 1), n=15)
8. 按時(shí)間間隔查找數(shù)據(jù)
enpoints()
9. period.apply
10. 分割
split()
與xts.split()
11. 發(fā)現(xiàn)周期性
periodicity()