代码之家  ›  专栏  ›  技术社区  ›  delcast

时间序列到数据帧

  •  1
  • delcast  · 技术社区  · 7 年前

    目标:

    datasets::Seatbelts

    这是一个时间序列对象,其时间戳为一个月和一年。我想在单独的列中提取月份和年份。见:

    > Seatbelts
             DriversKilled drivers front rear   kms PetrolPrice VanKilled law
    Jan 1969           107    1687   867  269  9059     0.10297        12   0
    Feb 1969            97    1508   825  265  7685     0.10236         6   0
    Mar 1969           102    1507   806  319  9963     0.10206        12   0
    Apr 1969            87    1385   814  407 10955     0.10087         8   0
    May 1969           119    1632   991  454 11823     0.10102        10   0
    Jun 1969           106    1511   945  427 12391     0.10058        13   0
    Jul 1969           110    1559  1004  522 13460     0.10377        11   0
    

    Converting ts object to data.frame

    该解决方案的问题是:

    data.frame(as.matrix(seatbelts), date=time(seatbelts))
    

    我得到了一个只有年份的列日期,月份似乎丢失了:

    > data.frame(as.matrix(seatbelts), date=time(seatbelts))
        DriversKilled drivers front rear   kms PetrolPrice VanKilled law date
    1             107    1687   867  269  9059     0.10297        12   0 1969
    2              97    1508   825  265  7685     0.10236         6   0 1969
    3             102    1507   806  319  9963     0.10206        12   0 1969
    4              87    1385   814  407 10955     0.10087         8   0 1969
    5             119    1632   991  454 11823     0.10102        10   0 1969
    6             106    1511   945  427 12391     0.10058        13   0 1969
    

    我想要一个带有月份和年份的日期列,或者一个单独的日期和年份列。

    2 回复  |  直到 7 年前
        1
  •  2
  •   alko989    7 年前

    res <- data.frame(as.matrix(Seatbelts), date=time(Seatbelts))
    res$year <- trunc(res$date)
    res$month <- (res$date - res$year) * 12 + 1
    res
    
    ##  DriversKilled drivers front rear   kms PetrolPrice VanKilled law     date year month
    ## 1           107    1687   867  269  9059   0.1029718        12   0 1969.000 1969     1
    ## 2            97    1508   825  265  7685   0.1023630         6   0 1969.083 1969     2
    ## 3           102    1507   806  319  9963   0.1020625        12   0 1969.167 1969     3
    ## 4            87    1385   814  407 10955   0.1008733         8   0 1969.250 1969     4
    ## 5           119    1632   991  454 11823   0.1010197        10   0 1969.333 1969     5
    ## 6           106    1511   945  427 12391   0.1005812        13   0 1969.417 1969     6
    
        2
  •  0
  •   DeduciveR    7 年前

    xts 首先格式化,然后转换为数据帧——后者的转换通常比 ts 对象下面的操作相当简单——将文本提取到新列中。

    library(xts)
    library(tidyverse)
    
    tsx <- as.xts(datasets::Seatbelts)
    df <- data.frame(date=index(tsx), coredata(tsx)) %>%
      mutate(date_chr = as.character(date),
             month    = substr(date, 1, 3),
             year     = substr(date, 5, 8))
    
          date DriversKilled drivers front rear   kms PetrolPrice VanKilled law date_chr month year
    1 Jan 1969           107    1687   867  269  9059   0.1029718        12   0 Jan 1969   Jan 1969
    2 Feb 1969            97    1508   825  265  7685   0.1023630         6   0 Feb 1969   Feb 1969
    3 Mar 1969           102    1507   806  319  9963   0.1020625        12   0 Mar 1969   Mar 1969
    4 Apr 1969            87    1385   814  407 10955   0.1008733         8   0 Apr 1969   Apr 1969
    5 May 1969           119    1632   991  454 11823   0.1010197        10   0 May 1969   May 1969
    6 Jun 1969           106    1511   945  427 12391   0.1005812        13   0 Jun 1969   Jun 1969