【问题标题】:How to convert daywise(daily) data to monthly data using R? [duplicate]如何使用 R 将每日(每日)数据转换为每月数据? [复制]
【发布时间】:2015-10-31 23:12:11
【问题描述】:

我有从 01-01-2000 到 01-01-2015 的 15 年利率的每日数据。 我想将此数据转换为只有月份和年份的月度数据。

我想取一个月中所有天数的平均值,并将其设为该月的一个值。 我如何在 R 中做到这一点。

> str(mibid)
'data.frame':   4263 obs. of  6 variables:
 $ Days: int  1 2 3 4 5 6 7 8 9 10 ...
 $ Date: Date, format: "2000-01-03" "2000-01-04" "2000-01-05" "2000-01-06" ...
 $ BID : num  8.82 8.82 8.88 8.79 8.78 8.8 8.81 8.82 8.86 8.78 ...
 $ I.S : num  0.092 0.0819 0.0779 0.0801 0.074 0.0766 0.0628 0.0887 0.0759 0.073 ...
 $ BOR : num  9.46 9.5 9.52 9.36 9.33 9.37 9.42 9.39 9.4 9.33 ...
 $ R.S : num  0.0822 0.0817 0.0828 0.0732 0.084 0.0919 0.0757 0.0725 0.0719 0.0564 ...
> head(mibid)
  Days       Date  BID    I.S  BOR    R.S
1    1 2000-01-03 8.82 0.0920 9.46 0.0822
2    2 2000-01-04 8.82 0.0819 9.50 0.0817
3    3 2000-01-05 8.88 0.0779 9.52 0.0828
4    4 2000-01-06 8.79 0.0801 9.36 0.0732
5    5 2000-01-07 8.78 0.0740 9.33 0.0840
6    6 2000-01-08 8.80 0.0766 9.37 0.0919
> 

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    我会用 xts 来做这个:

    set.seed(21)
    mibid <- data.frame(Date=Sys.Date()-100:1,
      BID=rnorm(100, 8, 0.1), I.S=rnorm(100, 0.08, 0.01),
      BOR=rnorm(100, 9, 0.1), R.S=rnorm(100, 0.08, 0.01))
    require(xts)
    # convert to xts
    xmibid <- xts(mibid[,-1], mibid[,1])
    # aggregate
    agg_xmibid <- apply.monthly(xmibid, colMeans)
    # convert back to data.frame
    agg_mibid <- data.frame(Date=index(agg_xmibid), agg_xmibid, row.names=NULL)
    head(agg_mibid)
    #         Date      BID        I.S      BOR        R.S
    # 1 2015-04-30 8.079301 0.07189111 9.074807 0.06819096
    # 2 2015-05-31 7.987479 0.07888328 8.999055 0.08090253
    # 3 2015-06-30 8.043845 0.07885779 9.018338 0.07847999
    # 4 2015-07-31 7.990822 0.07799489 8.980492 0.08162038
    # 5 2015-08-07 8.000414 0.08535749 9.044867 0.07755017
    

    【讨论】:

      【解决方案2】:

      如何使用dplyrlubridate 完成此操作的小示例

      set.seed(321)
      dat <- data.frame(day=seq.Date(as.Date("2010-01-01"), length.out=200, by="day"), 
             x = rnorm(200), 
             y = rexp(200))
      head(dat)
      
               day          x         y
      1 2010-01-01  1.7049032 2.6286754
      2 2010-01-02 -0.7120386 0.3916089
      3 2010-01-03 -0.2779849 0.1815379
      4 2010-01-04 -0.1196490 0.1234461
      5 2010-01-05 -0.1239606 2.2237404
      6 2010-01-06  0.2681838 0.3217511
      
      require(dplyr)
      require(lubridate)
      dat %>%
        mutate(year = year(day), 
               monthnum = month(day),
               month = month(day, label=T)) %>%
        group_by(year, month) %>%
        arrange(year, monthnum) %>%
        select(-monthnum) %>%
        summarise(x = mean(x), 
                  y = mean(y))
      
       Source: local data frame [7 x 4]
       Groups: year
      
        year month           x         y
      1 2010   Jan  0.02958633 0.9387509
      2 2010   Feb  0.07711820 1.0985411
      3 2010   Mar -0.06429982 1.2395438
      4 2010   Apr -0.01787658 1.3627864
      5 2010   May  0.19131861 1.1802712
      6 2010   Jun -0.04894075 0.8224855
      7 2010   Jul -0.22410057 1.1749863
      

      【讨论】:

        【解决方案3】:

        另一个选择是使用data.table,它有几个非常方便的日期时间函数。使用@SamThomas 的数据:

        library(data.table)
        setDT(dat)[, lapply(.SD, mean), by=.(year(day), month(day))]
        

        这给出了:

           year month           x         y
        1: 2010     1  0.02958633 0.9387509
        2: 2010     2  0.07711820 1.0985411
        3: 2010     3 -0.06429982 1.2395438
        4: 2010     4 -0.01787658 1.3627864
        5: 2010     5  0.19131861 1.1802712
        6: 2010     6 -0.04894075 0.8224855
        7: 2010     7 -0.22410057 1.1749863
        

        关于@JoshuaUlrich 的数据:

        setDT(mibid)[, lapply(.SD, mean), by=.(year(Date), month(Date))]
        

        给予:

           year month      BID        I.S      BOR        R.S
        1: 2015     5 7.997178 0.07794925 8.999625 0.08062426
        2: 2015     6 8.034805 0.07940600 9.019823 0.07823314
        3: 2015     7 7.989371 0.07822263 8.996015 0.08195401
        4: 2015     8 8.010541 0.08364351 8.982793 0.07748399
        

        如果您想要月份的名称而不是数字,则必须在setDT() 部分之后包含[, day:=as.IDate(day)],并使用months 而不是month

        setDT(mibid)[, Date:=as.IDate(Date)][, lapply(.SD, mean), by=.(year(Date), months(Date))]
        

        注意:尤其是在较大的数据集上,data.table 可能会(很多)比其他两个解决方案快。

        【讨论】:

        • 非常有用,谢谢!
        猜你喜欢
        • 2013-05-02
        • 1970-01-01
        • 2018-08-19
        • 2017-11-02
        • 2021-04-28
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 2021-06-19
        相关资源
        最近更新 更多