簡體   English   中英

在R中使用以前的值添加缺失的日期-將季度數據轉換為每日數據

[英]Add missing dates with previous values in R - converting quarterly to daily data

我正在嘗試通過在缺失的日期上添加先前的值來將季度數據轉換為每日數據。 該數據由不同股票的財務比率組成。 我的數據有一個由兩列構成的行標簽:報價器和日期。 由於我對每只股票都有重復的日期,因此我不確定如何忽略此行情自動收錄器,並使用先前的值重新填充缺少的日期。

到目前為止,這是一小部分數據的外觀:

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

我搜索了答案和此鏈接: 在R中使用線性插值添加丟失的xts / zoo數據與我想要的有點相似 雖然我不確定如何處理股票代碼。

非常感謝你的幫助!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM