使用 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+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.