簡體   English   中英

如何從 R 中的時間序列數據集中提取每年

[英]How to extract each year from a time-series data set in R

我有一個時間序列數據集EuStockMarket 它包含從 1991 年到 1998 年對四個股票市場的觀察結果。我想分別提取每一年。

data(EuStockMarkets)
str(EuStockMarkets)

試試這個,使用 tsibble package:

library(tsibble)

tsbl <- as_tsibble(EuStockMarkets)

tsbl %>%
  group_by_key() %>%
  index_by(year = ~ year(.))

# A tsibble: 7,440 x 4 [1s] <UTC>
# Key:       key [4]
# Groups:    key @ year [32]
   index               key   value  year
   <dttm>              <chr> <dbl> <dbl>
 1 1991-07-01 02:18:33 DAX   1629.  1991
 2 1991-07-02 12:00:00 DAX   1614.  1991
 3 1991-07-03 21:41:27 DAX   1607.  1991
 4 1991-07-05 07:22:55 DAX   1621.  1991
 5 1991-07-06 17:04:22 DAX   1618.  1991
 6 1991-07-08 02:46:21 DAX   1611.  1991
 7 1991-07-09 12:27:49 DAX   1631.  1991
 8 1991-07-10 22:09:16 DAX   1640.  1991
 9 1991-07-12 07:50:44 DAX   1635.  1991
10 1991-07-13 17:32:11 DAX   1646.  1991
# ... with 7,430 more rows

問題中的輸入 EuStockMarkets 是 ts object,因此我們假設問題是查找具有每年一個組件的 ts 對象列表。 我們提供以下解決方案。 在每種情況下,年份都用作列表組成部分的名稱。

1) 動物園

從 ts 轉換為 zoo class 以便我們可以使用 split.zoo,按年份拆分(integer 部分時間是年份)並轉換回 ts。 (如果動物園對象列表沒問題,則省略 lapply。)

library(zoo)
lapply(split(as.zoo(EuStockMarkets), as.integer(time(EuStockMarkets))), as.ts)

2) 基地

此解決方案不如 (1) 緊湊,但如果您需要避免 package 依賴項,它不會使用任何依賴項。 它首先將時間向量拆分為年份,然后為每個組件使用 window 提取該年份的子系列,並給出 ts 對象的列表。

spl <- split(time(EuStockMarkets), as.integer(time(EuStockMarkets)))
Map(window, start = Map(min, spl), end = Map(max, spl), list(EuStockMarkets))

選項1

您可以拆分類似矩陣的ts object 並通過Map()重建每年的時間序列。 最終的 output 是一個包含 1991 年到 1998 年的ts對象的列表。您可以使用$符號來提取每年。

tm <- time(EuStockMarkets)
res1 <- Map(ts, split(as.data.frame(EuStockMarkets), floor(tm)),
            tm[c(T, cycle(EuStockMarkets)[-1] == 1)],
            frequency = frequency(EuStockMarkets))

選項 2

另一種不拆分數據的解決方案,可能會稍微提高效率。

cyc <- cycle(EuStockMarkets)[-1] ; tm <- time(EuStockMarkets)
res2 <- Map(window, list(EuStockMarkets), tm[c(T, cyc == 1)], tm[c(cyc == 1, T)])
names(res2) <- sapply(res2, start)[1, ]

Output

res1$`1991`

# Time Series:
# Start = c(1991, 130) 
# End = c(1991, 260) 
# Frequency = 260 
#              DAX    SMI    CAC   FTSE
# 1991.496 1628.75 1678.1 1772.8 2443.6
# 1991.500 1613.63 1688.5 1750.5 2460.2
# 1991.504 1606.51 1678.6 1718.0 2448.2
# etc.

res1$`1998`

# Time Series:
# Start = c(1998, 1) 
# End = c(1998, 169) 
# Frequency = 260 
#              DAX    SMI    CAC   FTSE
# 1998.000 4132.79 6044.7 2858.1 5049.8
# 1998.004 4132.79 6046.7 2874.1 5013.9
# 1998.008 4132.79 6046.7 2874.1 5013.9
# etc.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM