【问题标题】:How to extract each year from a time-series data set in R如何从R中的时间序列数据集中提取每年
【发布时间】:2020-08-16 11:13:59
【问题描述】:

我有一个时间序列数据集EuStockMarket。它包含从 1991 年到 1998 年对四个股票市场的观察。我想分别提取每一年。

data(EuStockMarkets)
str(EuStockMarkets)

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    问题中的输入 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))
    

    【讨论】:

      【解决方案2】:

      试试这个,使用 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
      

      【讨论】:

        【解决方案3】:

        选项 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.
        

        【讨论】:

          猜你喜欢
          • 2021-07-15
          • 1970-01-01
          • 2016-09-12
          • 2015-05-25
          • 2021-05-16
          • 2017-06-25
          • 1970-01-01
          • 2023-01-27
          • 2022-08-23
          相关资源
          最近更新 更多