使用 xts & zoo 在 R 中操作时间序列数据
xts 和 zoo 是两个 R 包,它们提供用于操作时间序列数据的工具和函数。这两个包都提供了用于读取、写入和操作以各种格式(例如 CSV、Excel 和其他数据源)存储的时间序列数据的函数。我们将首先介绍 xts 和 zoo 类、基本操作、合并和修改时间序列,最后我们将讨论按时间应用和聚合。
XTS 和 Zoo 类
语法
在 R 中,xts 扩展了 zoo 类。xts 对象类似于由时间对象索引的观测矩阵。我们可以使用以下语法创建 xts 对象:
xts(myData, order.by)
这里 myData 代表数据,order.by 代表数据/时间类型向量(用于索引数据)
请注意,还可以通过创建名称值对(如 birthdayDate = as.POSIXct(“2000-09-07”))来向 xts 对象添加元数据。
示例
考虑以下示例,该示例使用由日期向量索引的数据向量创建 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 对象,它由包含 2022 年 1 月 1 日至 2022 年 1 月 10 日日期的日期向量索引。
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
如输出所示,2022 年 1 月 1 日和 2022 年 3 月 1 日之间的数据持续时间将打印在控制台上。
我们还可以在两个时间间隔之间使用正斜杠:
# 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")
示例
让我们考虑以下程序,该程序包含所有 xts 对象,其日期范围为 2022 年 1 月 1 日至 2022 年 1 月 10 日:
# 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 函数来打印星期日日期(2022 年 1 月 2 日和 2022 年 1 月 9 日)和端点日期(2022 年 1 月 10 日):
# 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
结论
在本教程中,我们讨论了如何使用 xts 和 zoo 在 R 中操作时间序列数据。我们详细讨论了基本操作、合并和修改时间序列,最后,我们讨论了如何按时间应用和聚合。我希望本教程能帮助您加强在数据科学领域的相关知识。