使用 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 中操作時間序列資料。我們詳細討論了基本操作、合併和修改時間序列,最後,我們討論瞭如何按時間應用和聚合。我希望本教程能幫助您加強在資料科學領域的相關知識。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP