【问题标题】:Fill NAs in a time series for specific number of dates only仅在特定日期数的时间序列中填写 NA
【发布时间】:2020-03-27 10:02:47
【问题描述】:

有没有办法在 xts 对象中填充 NA,但最多只能向前一个月?我的时间序列是工作日频率。我想避免在特定日期用超过一个月的值向后填充数据。 #注意:每个月的工作日没有变化,因此,我没有固定的数字可以设置为na.locf 中的maxgap 的输入。另外,maxgap =20 在下面的Z 列示例集上对我不起作用。

数据集的小节选:

tempY <- structure(c(1.013367062565, 1.02549265039, 1.06441613562, 1.061125834671, 
1.058095154587, 1.019989589422, 1.009980314126, 1.020806729739, 
1.026513004385, 1.025998357485, 1.011398006146, NA, 1.014043343859, 
1.016744497778, 1.027453095813, 1.030421507552, 1.059024397083, 
1.050921074032, 1.054401954388, 1.05940756622, 1.088564123549, 
1.063802687358, 1.047656980939, 1.051924103152, 1.038016436332, 
1.038100571345, 1.037565907689, 1.024397906272, 1.04517232233, 
1.040964696607, 1.085927457557, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1.141623602982, 
NA, NA, NA, NA, NA, NA, NA, NA, 1.044212, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", index = structure(c(946598400, 
946857600, 946944000, 947030400, 947116800, 947203200, 947462400, 
947548800, 947635200, 947721600, 947808000, 948067200, 948153600, 
948240000, 948326400, 948412800, 948672000, 948758400, 948844800, 
948931200, 949017600, 949276800, 949363200, 949449600, 949536000, 
949622400, 949881600, 949968000, 950054400, 950140800), tzone = "UTC", tclass = "Date"), .Dim = c(30L, 
3L), .Dimnames = list(NULL, c("X", "Y", "Z")))

预期输出:

tempZ <- structure(c(1.013367062565, 1.02549265039, 1.06441613562, 1.061125834671, 
1.058095154587, 1.019989589422, 1.009980314126, 1.020806729739, 
1.026513004385, 1.025998357485, 1.011398006146, 1.011398006146, 
1.014043343859, 1.016744497778, 1.027453095813, 1.030421507552, 
1.059024397083, 1.050921074032, 1.054401954388, 1.05940756622, 
1.088564123549, 1.063802687358, 1.047656980939, 1.051924103152, 
1.038016436332, 1.038100571345, 1.037565907689, 1.024397906272, 
1.04517232233, 1.040964696607, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 
1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 
1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 1.044212, 
1.044212, NA, NA, NA, NA, NA, NA, NA, NA), class = c("xts", "zoo"
), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", index = structure(c(946598400, 
946857600, 946944000, 947030400, 947116800, 947203200, 947462400, 
947548800, 947635200, 947721600, 947808000, 948067200, 948153600, 
948240000, 948326400, 948412800, 948672000, 948758400, 948844800, 
948931200, 949017600, 949276800, 949363200, 949449600, 949536000, 
949622400, 949881600, 949968000, 950054400, 950140800), tzone = "UTC", tclass = "Date"), .Dim = c(30L, 
3L), .Dimnames = list(NULL, c("X", "Y", "Z")))

更新:@G。 Grothendieck:一个变量的 dput 输出:

structure(c(1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.085927457557, 1.085927457557, 1.085927457557, 
1.085927457557, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.141623602982, 1.141623602982, 
1.141623602982, 1.141623602982, 1.181744131387, 1.181744131387, 
1.181744131387, 1.181744131387, 1.181744131387, 1.181744131387, 
1.181744131387, 1.181744131387, 1.181744131387, 1.181744131387, 
1.181744131387, 1.181744131387, 1.181744131387, 1.181744131387, 
1.181744131387, 1.181744131387, 1.181744131387, 1.181744131387, 
1.181744131387, 1.181744131387, 1.181744131387, NA, NA, 1.113811336182, 
1.113811336182, 1.113811336182, 1.113811336182, 1.113811336182
), class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", index = structure(c(946598400, 
946857600, 946944000, 947030400, 947116800, 947203200, 947462400, 
947548800, 947635200, 947721600, 947808000, 948067200, 948153600, 
948240000, 948326400, 948412800, 948672000, 948758400, 948844800, 
948931200, 949017600, 949276800, 949363200, 949449600, 949536000, 
949622400, 949881600, 949968000, 950054400, 950140800, 950227200, 
950486400, 950572800, 950659200, 950745600, 950832000, 951091200, 
951177600, 951264000, 951350400, 951436800, 951696000, 951782400, 
951868800, 951955200, 952041600, 952300800, 952387200, 952473600, 
952560000, 952646400, 952905600, 952992000, 953078400, 953164800, 
953251200, 953510400, 953596800, 953683200, 953769600, 953856000, 
954115200, 954201600, 954288000, 954374400, 954460800, 954720000, 
954806400, 954892800, 954979200), tzone = "UTC", tclass = "Date"), .Dim = c(70L, 
1L), .Dimnames = list(NULL, "X990100"))```

【问题讨论】:

    标签: r time-series na xts quantitative-finance


    【解决方案1】:

    rollapplyr in zoo 可以采用向量宽度。我们可以将它的每个元素设置为从当前点到一个月前的点数(即当前位置减去一个月前的位置)然后rollapplyr可以将na.locf0应用到仅上个月。

    library(lubridate)
    library(xts)
    
    tt <- time(tempY)
    w <- seq_along(tt) - findInterval(tt %m-% months(1), tt)
    Fill <- function(x) {
      last <- tail(x, 1)
      if (is.na(last)) tail(na.locf0(x), 1) else last
    }
    
    rollapplyr(as.zoo(tempY), w, Fill)
    

    【讨论】:

    • 这很有帮助,谢谢!对了,我能不能厚着脸皮请你看看另一个滚动窗口问题:[stackoverflow.com/questions/59103221/…Thanks!!
    • 查看输出,您能否建议我如何将其更改为有时可以容纳 1 个月 +2 天。如果您查看 dput(现在包含在我上面的问题中),您会注意到 2000 年 2 月的最后一个工作日是 28 日,因此该值仅结转至 2000 年 3 月 28 日,而不是 2000 年 3 月 30 日。谢谢!
    • 我不确定我是否理解输出的问题或上下文。如果 x 是日期类向量,例如x &lt;- Sys.Date() - (1:0) 然后x-2 是每个组件前两天,as.Date(as.yearmon(x) - 1/12, frac = 1) - 2 是上个月月底前两天。这就是你要问的吗?这些都不使用润滑。
    • 感谢您抽出宝贵时间查看此内容。我正在处理财务数据,以添加一些背景信息。该数据集列出了特定时间段内每个工作日的金融价格。因此,某些月份的最后一个值将在该月最后一个日期之前的日期。此外,某个月的天数少于接下来的几个月(例如 2000 年 2 月)。虽然您的代码适用于大多数日期,但在一个月内出现的特定日期上出现问题,但在前一个月内却没有。以 2000 年 2 月为例,最后一个数据点是 28 日。 ...
    • 因此,我无法使用 na.locf 填充 2000 年 3 月 29 日至 31 日日期的 NA。如何修改代码以允许灵活地延长几天超出精确的 1 个月在这种情况下。我试过w &lt;- seq_along(tt) - findInterval(tt %m-% months(1) - 2, tt)。但这可能会影响每月 1 日的 NA 回填。例如,如果 NA 是 2000 年 3 月 1 日,如果最后一个值是 2000 年 1 月 31 日但不是之后;我不想用 2000 年 1 月 31 日来代替 NA。
    猜你喜欢
    • 2023-01-25
    • 2018-05-21
    • 2016-07-31
    • 1970-01-01
    • 2014-11-14
    • 2018-09-06
    • 2012-12-10
    相关资源
    最近更新 更多