使用R中的先前值添加缺少日期 - 将季度转换为每日数据

时间:2016-11-21 19:38:00

标签: r time-series xts zoo

我试图通过在缺失日期添加先前的值来将季度数据转换为每日数据。该数据包括不同股票的财务比率。我的数据有一个由两列构建的行标签:自动收报机和日期。由于我有每个股票的重复日期,我不知道如何忽略股票代码并用之前的值重新填充缺少的日期。

以下是迄今为止的一小部分数据样本:

> 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有点接近我想要的。虽然我不知道如何处理股票代码。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

使用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)