R软件xts包基础内容学习(时间序列)

zoo是时间序列的基础库,而xts在zoo基础上进行了拓展,其对日期的处理较zoo更为精细。
                zoo = matrix + index
             xts = vector + matrix + attributed
即xts由三部分组成。
1.索引部分:时间类型向量
2.数据部分:以矩阵为基础类型,支持可以与矩阵相互转换的任何类型
3.属性部分:附件信息,包括时区,索引时间类型的格式等

一、安装xts包

> install.packages("xts")

二、时间类型数据

在学习xts之前,需要先了解时间类型数据。

  1. 在R语言里面有两个基本的函数:as.POSIXlt() 和 as.POSIXct()可以把表示时间的字符串转化为时间类型数据。
> myDataTimeStr = "2013-12-19 10:17:07"      #此时数据类型为character
> class(myDataTimeStr)
[1] "character"
> myPOSIXct = as.POSIXct(myDataTimeStr)      #虽然表现形式一样,但通过class()可知已完成数据类型转换
> class(myPOSIXct)
[1] "POSIXct" "POSIXt" 

*注意:一周是按0到6开始的,0是星期日

  1. datetime的默认格式是“yyyy-mm-dd hh:mm:ss”或“yyyy/mm/dd hh:mm:ss”。
    若要改变时间表达格式,可以使用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"
  1. “POSIXct”对象有一个内部表示,它是来自某个起始datetime的秒数,我们也可以从数值数据中创建它们。
> 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

请注意,因为“CST”(中国标准时间)比“gm/UTC”时间晚8个小时,所以日期显示为“1970-01-01 08:00 CST”。

  1. 在许多情况下,最好在“GMT(UTC)”中定义datetimes,以避免在处理datetimes时出现时区问题。
> as.POSIXct("1960-01-01",tz = "GMT")
[1] "1960-01-01 GMT"
  1. 可以使用Sys.setenv(TZ = "UTC")来设置系统市区到“GMT(UTC)”,使其变为默认时区。
    但如果你想再转到“CST”(中国标准时间),使用Sys.setenv(TZ = "CST")是无效的,这是因为CST有四种不同的含义。建议可以用Sys.setenv(TZ = "Asia/Shanghai"),或者使用ISOdatetime()函数。
> 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"
  1. 时间数据的加减
> myPOSIXct2
[1] "1970-01-02 08:00:00 CST"
> myPOSIXct4 = myPOSIXct2 - 8*60*60
> myPOSIXct4
[1] "1970-01-02 CST"
  1. 当前时间
> Sys.time()

三、xts基础内容

1. 构建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)           #随机生成五个数字
> 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. 解构xts

当使用时间序列时,有时需要将您的时间序列分离到其核心数据和索引属性中,以进行额外的分析和操作。核心数据是“xts”的矩阵部分。您可以使用coredata()将其与“xts”对象分隔开。xts对象的索引部分可用index()函数来获得。

> hayek_core <- coredata(hayek)
> class(hayek_core)
[1] "matrix"
> hayek_index <- index(hayek)
> class(hayek_index)
[1] "Date"
3. 取出时间1至时间2之间的数据
> x <- as.xts(x)    #将x从zoo变为xts
> x_2016 <- x["2016"]     #提取2016年的数据
> jan_march <- x["2016-01-01/2016-03-22"]    #提取2016年1月1日至3月22日的数据

#提取某几天的数据
> dates <- as.Date(c("2016-06-04","2016-06-08"))
> thedata <- x[dates] 
4. 提取最后几天的数据

使用last()first()函数

> 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")                       #提取最后一周的数据
> 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)                                       #提取最后一周的最后两天的数据
           temp.max temp.mean temp.min
2017-07-15       75        69       60
2017-07-16       79        77       60
> first(lastweek,"-2 days")                              #提取最后一周除开始两天以外的数据
           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")   #提取第二周前三天的数据
           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. 结合多个时间序列

使用merge()函数。注意dataframe不能直接使用merge()

> merge(x, y, join = "inner")   #以x,y都有的时间为准
> merge(x, y, join = "left", fill = 0)    #以x的时间为准,y空缺部分补0
> merge(x, y, join = "right")   #以y的时间为准
6. 滞后时间序列&先行时间序列

创造一个x的先行一期时间序列:

> lead_x <- lag(x, k = -1)

创造一个x的滞后一期时间序列:

> 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. 按时间间隔查找数据

enpoints()

9. period.apply
10. 分割

split()xts.split()

11. 发现周期性

periodicity()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 本文尝试翻译了Garrett Grolemund(《R语言入门与实践》作者)和Hadley Wickham两位大神...
    奔跑的蜈蚣阅读 10,387评论 0 6
  • 基本概念 我们先来介绍一些可能当年在地理课上学习过的基本概念。 说起来,时间真是一个神奇的东西。以前人们通过观察太...
    舌尖上的大胖阅读 636评论 0 0
  • 韩寒在《一个》中讲到过“身边的碎片越来越多,新闻越来越杂,话题越来越爆,什么都是来得快去得快,多睡几个小时就感觉和...
    艾越阅读 248评论 0 0