【发布时间】:2020-08-16 11:13:59
【问题描述】:
我有一个时间序列数据集EuStockMarket。它包含从 1991 年到 1998 年对四个股票市场的观察。我想分别提取每一年。
data(EuStockMarkets)
str(EuStockMarkets)
【问题讨论】:
标签: r time-series
我有一个时间序列数据集EuStockMarket。它包含从 1991 年到 1998 年对四个股票市场的观察。我想分别提取每一年。
data(EuStockMarkets)
str(EuStockMarkets)
【问题讨论】:
标签: r time-series
问题中的输入 EuStockMarkets 是一个 ts 对象,因此我们假设该问题正在寻找具有每年一个组件的 ts 对象列表。我们提供以下解决方案。在每种情况下,年份都用作列表组件的名称。
1) 动物园
从ts转换为zoo类,这样我们就可以使用split.zoo,按年份拆分(时间的整数部分是年份)再转换回ts。 (如果动物园对象列表没问题,则省略 lapply。)
library(zoo)
lapply(split(as.zoo(EuStockMarkets), as.integer(time(EuStockMarkets))), as.ts)
2) 基础
这个解决方案不像 (1) 那样紧凑,但如果你需要避免包依赖,它不会使用任何包。它首先将时间向量拆分为年份,然后为每个组件使用 window 提取该年份的子系列,并给出 ts 对象的列表。
spl <- split(time(EuStockMarkets), as.integer(time(EuStockMarkets)))
Map(window, start = Map(min, spl), end = Map(max, spl), list(EuStockMarkets))
【讨论】:
试试这个,使用 tsibble 包:
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
【讨论】:
选项 1
您可以拆分类似矩阵的ts 对象并通过Map() 重构每年的时间序列。最终输出是一个列表,其中包含从 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, ]
输出
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.
【讨论】: