【问题标题】:Subset xts file by date按日期对 xts 文件进行子集
【发布时间】:2017-07-25 04:50:41
【问题描述】:

我是 R 编码的新手,发现自己陷入了困境。我的文件包含高频股票指数数据,它被转换为 xts 文件。 见下图(左栏为日期时间,右栏为日内回报):

2007-01-02 09:00:00  0.000000e+00

2007-01-02 09:01:00  2.670405e-05

2007-01-02 09:02:00  1.387629e-03

2007-01-02 09:03:00 -1.866841e-04

2007-01-02 09:04:00 -3.201110e-04

2007-01-03 09:00:00 0,0000000000

2007-01-03 09:01:00 -1.321929e-04

2007-01-03 09:02:00 -1.586546e-04

2007-01-03 09:03:00  7.665975e-04

2007-01-03 09:04:00 -5.284993e-05

2007-01-03 09:05:00 -2.907246e-04

我的数据超过 5 年,我想要将其子集 500 天,然后将其循环向前移动 30 天。但是,循环本身并不是必需的,但非常感谢如何构造这种函数的帮助。

我使用了以下函数,其中我的数据集被命名为“DIRV”,它是当日回报的总和:

b<-head(DIRV, n=500)

L<-as.Date(index(b)[1])

J<-as.Date(index(b)[500])

V<-IRV["L/J"]

但我收到以下错误:

if (length(c(year, month, day, hour, min, sec)) == 6 && c(year, : 需要 TRUE/FALSE 的缺失值时出错

另外:警告信息:

1:在 as_numeric(YYYY) 中:强制引入的 NA 2:在 as_numeric(YYYY) : 强制引入的 NAs

【问题讨论】:

    标签: r subset xts


    【解决方案1】:

    出现您的错误是因为您试图将日期时间作为字符串"L/J" 进行子集化,这对子集化操作没有意义。另外,请注意LJ 不要返回NA,这可能会出现在数据的边界上,否则会出错。

    试试这个来避免错误:

    if (is.na(L) || is.na(J)) stop("Not a valid date range.")
    V <-IRV[paste0(L,"/", J), ]
    

    您希望仔细处理窗口的边缘情况。

    当您说 “我想要将其子集化 500 天,然后将其循环向前移动 30 天”时,我不太理解您的意思。。如果您的意思是计算数据的滚动窗口,您也许可以使用rollapplyr(请参阅?rollapplyr)。

    【讨论】:

    • 非常感谢 FXQuantTrader 的“paste0”功能正是我正在寻找的功能,并且脚本现在工作正常。在这种情况下,我没有让 rollapplyr 工作,因为它要求我按分钟滚动而不是按天滚动,并且由于每日数据在某些日子由不同数量的观察组成,因此我无法运行这个功能准确。
    猜你喜欢
    • 2020-10-29
    • 2017-09-06
    • 2016-12-27
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多