我有1分钟的日内价格数据,缺少数据点。因此我想填补它们。
我仔细阅读了以下帖子中的建议并尝试了类似的程序: R: Filling missing dates in a time series?
在我的情况下,缺失的数据点是第一笔交易,即09:31:00。
> head(s)
AMR.Open AMR.High AMR.Low AMR.Close AMR.Volume AMR.WAP AMR.hasGaps AMR.Count
2010-09-10 09:32:00 6.08 6.10 6.07 6.10 298 6.087 0 39
2010-09-10 09:33:00 6.10 6.14 6.10 6.14 274 6.122 0 70
2010-09-10 09:34:00 6.14 6.15 6.13 6.13 472 6.133 0 96
2010-09-10 09:35:00 6.13 6.14 6.13 6.13 291 6.133 0 68
2010-09-10 09:36:00 6.13 6.13 6.11 6.11 548 6.123 0 97
2010-09-10 09:37:00 6.11 6.11 6.11 6.11 67 6.110 0 26
> na.locf(s, xout=seq(as.POSIXct(head(index(s), 1) - 60), as.POSIXct(tail(index(s), 1)), by="1 min")) -> ss
> head(ss)
AMR.Open AMR.High AMR.Low AMR.Close AMR.Volume AMR.WAP AMR.hasGaps AMR.Count
2010-09-10 09:32:00 6.08 6.10 6.07 6.10 298 6.087 0 39
2010-09-10 09:33:00 6.10 6.14 6.10 6.14 274 6.122 0 70
2010-09-10 09:34:00 6.14 6.15 6.13 6.13 472 6.133 0 96
2010-09-10 09:35:00 6.13 6.14 6.13 6.13 291 6.133 0 68
2010-09-10 09:36:00 6.13 6.13 6.11 6.11 548 6.123 0 97
2010-09-10 09:37:00 6.11 6.11 6.11 6.11 67 6.110 0 26
如上所示,返回的对象未按要求填充。
下面你可以看到我正确指定了开始和结束时间。
> as.POSIXct(head(index(s), 1) - 60)
[1] "2010-09-10 09:31:00 EDT"
> as.POSIXct(tail(index(s), 1))
[1] "2010-09-10 16:00:00 EDT"
>
这可能是因为日期范围指定了时区而原始POSIX索引没有?我试图通过指定tz =“”来删除tz,但这并没有删除它。话虽这么说,时区可能只是一个红鲱鱼。
如果有人对测试感兴趣,我以rda(二进制)格式保存数据:
http://www.speedyshare.com/files/28576853/test.rda
感谢帮助。
答案 0 :(得分:2)
na.locf
对数据进行操作,而不是对索引进行操作。如果您要为数据添加一行NA
,则需要将rbind
的{x}对象设为s
:
miss <- xts(matrix(1*NA,1,NCOL(s)), first(index(s))-60)
s <- rbind(miss,s)
s <- na.locf(s, fromLast=TRUE)