使用 xts & zoo 在 R 中操作时间序列数据


xtszoo 是两个 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 中操作时间序列数据。我们详细讨论了基本操作、合并和修改时间序列,最后,我们讨论了如何按时间应用和聚合。我希望本教程能帮助您加强在数据科学领域的相关知识。

更新于:2023 年 1 月 17 日

1K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告