【问题标题】:Add missing dates with previous values in R - converting quarterly to daily data在 R 中添加具有先前值的缺失日期 - 将季度数据转换为每日数据
【发布时间】:2017-04-05 07:27:59
【问题描述】:

我正在尝试通过添加缺失日期的先前值来将季度数据转换为每日数据。该数据由不同股票的财务比率组成。我的数据有一个由两列构建的行标签:股票代码和日期。由于我对每只股票都有重复的日期,我不确定如何忽略股票代码并用以前的值重新填充缺失的日期。

到目前为止,小样本数据如下所示:

> df_new
                   de   eps      pe    ps    pb
APD 2015-09-30  1.373   1.6  21.463 2.772 3.784
APD 2015-12-31  1.325  1.68  21.284 2.893 3.805
APD 2016-03-31  1.411 -2.19  56.114 3.254 4.491
SWKS 2003-03-31 0.402 -0.04    <NA>  <NA>  <NA>
SWKS 2003-06-30 0.397 -0.04  -2.289 1.518 0.929
SWKS 2003-09-30  0.62 -0.29  -2.799 2.046 1.877
SWKS 2003-12-31 0.643  0.03 -25.426 2.045 1.905
SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579
SWKS 2004-06-30 0.584  0.09  -37.18 1.825 1.782
SWKS 2004-09-30 0.555   0.1  65.806 1.881 1.962
SWKS 2004-12-31 0.525  0.09  45.823 1.777 1.912

我希望它看起来像这样(如果是每周):

> df_new
                   de   eps      pe    ps    pb
APD 2015-09-30  1.373   1.6  21.463 2.772 3.784
APD 2015-10-01  1.373   1.6  21.463 2.772 3.784
APD 2015-10-02  1.373   1.6  21.463 2.772 3.784
APD 2015-10-03  1.373   1.6  21.463 2.772 3.784
... 
APD 2015-12-31  1.325  1.68  21.284 2.893 3.805
APD 2016-01-01  1.325  1.68  21.284 2.893 3.805
APD 2016-01-02  1.325  1.68  21.284 2.893 3.805
APD 2016-01-03  1.325  1.68  21.284 2.893 3.805
...
APD 2016-03-31  1.411 -2.19  56.114 3.254 4.491
APD 2016-04-01  1.411 -2.19  56.114 3.254 4.491
APD 2016-04-02  1.411 -2.19  56.114 3.254 4.491
APD 2016-04-03  1.411 -2.19  56.114 3.254 4.491
...
SWKS 2003-03-31 0.402 -0.04    <NA>  <NA>  <NA>
SWKS 2003-04-01 0.402 -0.04    <NA>  <NA>  <NA>
SWKS 2003-04-02 0.402 -0.04    <NA>  <NA>  <NA>
SWKS 2003-04-03 0.402 -0.04    <NA>  <NA>  <NA>
...
SWKS 2003-06-30 0.397 -0.04  -2.289 1.518 0.929
and so on...

我搜索了答案,这个链接:Add missing xts/zoo data with linear interpolation in R 有点接近我想要的。虽然我不确定如何处理股票代码。

非常感谢您的帮助!

【问题讨论】:

    标签: r time-series xts zoo


    【解决方案1】:

    使用by 将显示的匿名函数应用于每个符号的行。该函数生成日期网格g 并将其与应用na.locf 以填充NA 值的数据框的原始行合并。最后,我们使用do.call("rbind", ...) 将生成的"by" 对象重新组合在一起。

    library(zoo) # na.locf
    
    df <- do.call("rbind", by(df_new, df_new$symbol, function(x) {
      rng <- range(x$date, na.rm = TRUE)
      g <- data.frame(date = seq(rng[1], rng[2], "day"))
      na.locf(merge(x, g, all = TRUE))
    }))
    

    注意:可重现形式的输入df_new 是:

    Lines <- "
    APD 2015-09-30  1.373   1.6  21.463 2.772 3.784
    APD 2015-12-31  1.325  1.68  21.284 2.893 3.805
    APD 2016-03-31  1.411 -2.19  56.114 3.254 4.491
    SWKS 2003-03-31 0.402 -0.04    <NA>  <NA>  <NA>
    SWKS 2003-06-30 0.397 -0.04  -2.289 1.518 0.929
    SWKS 2003-09-30  0.62 -0.29  -2.799 2.046 1.877
    SWKS 2003-12-31 0.643  0.03 -25.426 2.045 1.905
    SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579
    SWKS 2004-06-30 0.584  0.09  -37.18 1.825 1.782
    SWKS 2004-09-30 0.555   0.1  65.806 1.881 1.962
    SWKS 2004-12-31 0.525  0.09  45.823 1.777 1.912"
    df_new <- read.table(text = Lines, 
       col.names = c("symbol", "date", "de", "eps", "pe", "ps", "pb"))
    df_new$date <- as.Date(df_new$date)
    

    【讨论】:

    • 非常感谢 G. Grothendieck 的快速回复!我想知道如何做你正在做的同样的事情,但行名(标签)是代码和符号,因为我的数据框已经像这样保存了(例如 rowname[1,1] 是 APD 2015-09 -30)。我将各种数据库整合到一个数据库中,但所有数据库都有不同的周期性,因此我使用行名作为标签,以便被每个现有数据库识别。
    • @marya 你可能想要rownames(df) &lt;- paste(df$symbol, df$date),但没有[1, 1] 这样的行名索引操作...
    • 感谢您对 FXQuantTrader 的评论!我只是想举一个第一行的行名示例,并以某种方式写了它,但你是对的!不是这样的事情,所以我的坏! (第一次在这个论坛上 :) ..)我的数据库已经以这种方式合并,行名是符号和日期,使用粘贴函数,我实际上是在问如何获得 G. Grothendieck 上面写的函数,但考虑到行名就像这。我想我可以使用单独的()来使用上面的函数,或者在粘贴()之前传递这个函数。再次感谢!!!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 2019-12-23
    • 2020-11-22
    • 2018-04-26
    • 2023-03-14
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多