R语言 用xts和zoo操纵时间序列数据
xts和zoo是两个R包,提供了操作时间序列数据的工具和函数。这两个包都提供了读取、写入和操作以各种格式存储的时间序列数据的功能,如CSV、Excel和其他数据源。我们将从介绍xts和zoo类、基本操作、合并和修改时间序列开始,到最后,我们将讨论按时间应用和聚合的问题。
XTS和zoo类
语法
在R中,xts扩展了zoo类。一个xts对象类似于一个由时间对象索引的观察矩阵。我们可以通过使用下面的语法来创建一个xts对象。
xts(myData, order.by)
这里myData代表数据,order.by代表一个数据/时间类型的向量(用于索引数据)。
请注意,我们也可以通过创建名-值对来将元数据包含在xts对象中,如birthdayDate = as.POSIXct(“2000-09-07”)。
示例
考虑下面的一个例子,它使用一个由日期向量索引的数据向量创建一个xts对象。正如你在下面看到的,我们也使用了名-值对来添加元数据—–。
# Importing xts library
library(xts)
# Creating a data
myData <- xts(x = rnorm(n = 10),
order.by = seq(as.Date("2022-01-01"),
length = 10,
by = "days"),
born = as.POSIXct("2000-09-07"))
# Print the data
print(myData)
输出
[,1]
2022-01-01 -0.7307375
2022-01-02 0.2299910
2022-01-03 -0.6965284
2022-01-04 -0.2002072
2022-01-05 1.1121364
2022-01-06 -0.6601843
2022-01-07 0.2926226
2022-01-08 1.2273859
2022-01-09 -0.5464344
2022-01-10 0.1108407
正如你在输出中所看到的,我们已经创建了一个XTS对象,它的索引是一个包含从01-01-2022到10-01-2022日期的日期向量。
Zoo类为我们提供了coredata()和index()函数,使用这些函数我们可以将核心数据和索引属性分开,以便进行分析和操作。
示例
# Importing xts library
library(xts)
# Creating a data
myData <- xts(x = rnorm(n = 10),
order.by = seq(as.Date("2022-01-01"),
length = 10,
by = "days"),
born = as.POSIXct("2000-09-07"))
# Using coredata() function
print(coredata(myData))
输出
[,1]
[1,] -2.4213283
[2,] -0.8433878
[3,] 2.0066340
[4,] 0.2640308
[5,] -0.3049552
[6,] 0.2998816
[7,] -0.4239970
[8,] 0.5577881
[9,] -0.5870677
[10,] 0.6856740
使用index()函数来获取实际日期
print(index(myData))
输出
[1] "2022-01-01" "2022-01-02" "2022-01-03" "2022-01-04"
[5] "2022-01-05" "2022-01-06" "2022-01-07" "2022-01-08"
[9] "2022-01-09" "2022-01-10"
正如你在输出中看到的,首先打印了核心数据,然后我们在控制台中打印了实际日期。
基本的时间序列数据操作
在这一节中,我们将讨论一些基本的操作,如基于索引的提取和两个时间间隔之间的正斜线的作用。
基于指数的提取
示例
xts类对象允许我们根据索引来提取值。让我们考虑下面的一个例子–
# Importing library
library(xts)
# Create myData
myData <- rnorm(n = 500)
dates <- seq(as.Date("2022-01-01"),
length = 500,
by = "days")
# Creating myObject
myObject <- xts(x = myData, order.by = dates)
# Print the number of rows at index "2022"
nrow(myObject["2022"])
输出
[1] 365
使用正斜线(/)来创建一个区间
示例
我们可以在XTS对象的两个时间间隔之间使用正斜杠,以获得指定间隔之间的持续时间。例如,考虑下面给出的一个程序–
# Importing library
library(xts)
# Create myData
myData <- rnorm(n = 500)
dates <- seq(as.Date("2022-01-01"),
length = 500,
by = "days")
# Creating myObject
myObject <- xts(x = dates, order.by = dates)
# Print the duration between the two time intervals
nrow(myObject["2022-01-01/2022-03-01"])
输出
[1] 60
正如你在输出中看到的,01-01-2022和01-03-2022之间的数据持续时间被打印在控制台。
我们也可以在两个时间间隔之间使用正斜线–
# Importing library
library(xts)
# Create myData
myData <- rnorm(n = 500)
# 20 days of data by minute
times <- rnorm(n = 60*24*20)
dateTimes = as.POSIXct("2022-11-01") + (1:(60*24*20))*60
# Creating myObject
myObject <- xts(x = times,
order.by = dateTimes)
# Print time intervals between,
# 2022-11-01 4AM and 2022-11-01 6AM
head(myObject["2022-11-01T04:00/2022-11-01T06:00"])
输出
[,1]
2022-11-01 04:00:00 -0.4277830
2022-11-01 04:01:00 0.6544654
2022-11-01 04:02:00 0.4196311
2022-11-01 04:03:00 -0.1766988
2022-11-01 04:04:00 -1.8570621
2022-11-01 04:05:00 0.3229214
正如你在输出中看到的,两个指定时间之间的时间间隔被打印在控制台。
合并和修改时间序列数据
语法
xts包为我们提供了merge()函数,使用该函数我们可以将一个xts对象与另一个索引上的对象连接起来,或者将一个包含日期的向量与一个xts对象连接起来。这个函数的语法如下
merge(object1, object2, ..., objectN, join = typeOfJoin, fill = integerValue)
第一个参数等于你要合并的对象。第二个参数是要执行的连接的类型。第三个参数是fill,指定如何处理NA值,它是一个可选的参数。
例子。执行内部连接
示例
现在让我们考虑一个程序,在两个含有日期元素的xts类对象之间执行一个内部连接,即
# Importing library
library(xts)
# Creating an object of xts class
myObject1 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-01",
"2022-11-04",
"2022-11-10",
"2022-11-23")))
# Creating another object of xts class
myObject2 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-04",
"2022-11-10",
"2022-11-15",
"2022-11-21")))
# Performing inner join
merge(myObject1, myObject2, join = "inner")
输出
myObject1 myObject2
2022-11-04 0.9151754 1.332591
2022-11-10 0.4244563 -1.494515
同样地,我们可以执行左外连接和右外连接。
例子。执行外连接和右外连接
示例
现在我们将看到一个演示两个xts类对象的全外连接的程序–
# Importing library
library(xts)
# Creating an object of xts class
myObject1 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-01",
"2022-11-04",
"2022-11-10",
"2022-11-23")))
# Creating another object of xts class
myObject2 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-04",
"2022-11-10",
"2022-11-15",
"2022-11-21")))
# Performing inner join
merge(myObject1, myObject2, join = "outer")
输出
myObject1 myObject2
2022-11-01 -0.1080882 NA
2022-11-04 0.6906676 -0.75314257
2022-11-10 -0.3375777 1.29528001
2022-11-15 NA 0.09088094
2022-11-21 NA 0.20408394
2022-11-23 -1.7205721 NA
例子。执行全外层连接
示例
考虑一下下面的另一个程序,它也是对两个对象进行全外连接。值得注意的是,这一次我们将第三个参数 “fill = 0 “传递给merge()函数。由于这个原因,所有的NA值在输出中都将被0所取代。
# Importing library
library(xts)
# Creating an object of xts class
myObject1 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-01",
"2022-11-04",
"2022-11-10",
"2022-11-23")))
# Creating another object of xts class
myObject2 <- xts(x = rnorm(n = 4),
order.by = as.Date(c("2022-11-04",
"2022-11-10",
"2022-11-15",
"2022-11-21")))
# Performing inner join
merge(myObject1, myObject2, join = "outer", fill = 0)
输出
myObject1 myObject2
2022-11-01 -0.27983799 0.000000
2022-11-04 0.56771575 1.079353
2022-11-10 0.09849405 1.169731
2022-11-15 0.00000000 -1.022448
2022-11-21 0.00000000 1.031976
2022-11-23 0.99577871 0.000000
按时间申请和汇总
xts类还提供了endpoints()函数,我们可以用它来获取参数所提到的每个区间的最后一个观测值的位置。
on = c("years", "quarters", "months", "hours", "minutes")
示例
让我们考虑下面的一个程序,它包含所有日期在01-01-2022到10-01-2022范围内的xts对象。
# Importing xts library
library(xts)
# Creating a data
myData <- xts(x = rnorm(n = 10),
order.by = seq(as.Date("2022-01-01"),
length = 10,
by = "days"),
born = as.POSIXct("2000-09-07"))
# Print myData
print(myData)
输出
[,1]
2022-01-01 -0.71176135
2022-01-02 0.07589876
2022-01-03 -0.06607525
2022-01-04 0.53143095
2022-01-05 0.11743337
2022-01-06 -0.29164378
2022-01-07 -0.04782661
2022-01-08 -1.93776118
2022-01-09 -0.04961253
2022-01-10 -0.45633307
现在我们可以在myData上使用endpoints函数来打印周日日期(02-01-2022和09-01-2022)和终点日期(10-01-2022)。
# Importing xts library
library(xts)
# Creating a data
myData <- xts(x = rnorm(n = 10),
order.by = seq(as.Date("2022-01-01"),
length = 10,
by = "days"),
born = as.POSIXct("2000-09-07"))
# Get endpoints
endPoints <- endpoints(myData, on = "weeks")
# Print the endpoints data from myData
myData[endPoints]
输出
[,1]
2022-01-02 0.399972612
2022-01-09 -0.009547296
2022-01-10 -0.622855139
结论
在本教程中,我们讨论了如何在R中使用xts和zoo来操作时间序列数据。我们详细讨论了基本操作,合并和修改时间序列,最后,我们讨论了如何应用和汇总时间。我希望这个教程能帮助你加强你在数据科学领域的知识。