【问题标题】:Changing periodicity of time series using xts使用 xts 改变时间序列的周期性
【发布时间】:2015-10-21 04:11:00
【问题描述】:

我有一个滴答频率的时间序列,如下所示:

                        V2     V3
2004-02-01 20:20:41 1.2474 1.2484
2004-02-01 21:13:52 1.2471 1.2481
2004-02-01 21:14:09 1.2469 1.2479
2004-02-01 21:38:57 1.2470 1.2480
2004-02-01 21:56:43 1.2468 1.2478
2004-02-01 21:56:47 1.2466 1.2476

为了将其转换为每日频率,我使用以下代码:

V.xts <- xts(V[, 2:3], order.by=as.POSIXct(V[, 1], format='%d/%m/%y %H:%M:%S'))
V.day<-to.daily(V.xts,OHLC=FALSE)

这会产生以下具有新频率的时间序列:

               V2     V3
2004-02-01 1.2475 1.2485
2004-02-02 1.2430 1.2432
2004-02-03 1.2544 1.2546
2004-02-04 1.2537 1.2539
2004-02-05 1.2563 1.2565
2004-02-06 1.2696 1.2706
2004-02-08 1.2642 1.2652
2004-02-09 1.2690 1.2692
2004-02-10 1.2682 1.2684
2004-02-11 1.2827 1.2829

其中,我猜我的代码返回了每日的收盘价,并且没有日期“2004-02-07”的价格。但是,如果日期“2004-02-07”没有价格,我想记录上一期的值来代替缺失值。然后我使用:

V.a <- align.time(V.day)
tmp <- xts(, seq.POSIXt(start(V.a), end(V.a), by='days'))
output <- cbind(tmp, V.a)

但是,我在第二个命令之后得到了这个错误:

Error in seq.POSIXt(start(V1.a), end(V1.a), by = "days") : 
  'from' must be a "POSIXt" object

我安装了带有依赖项的“xts”包:“动物园”和“日期”。 然后我尝试通过以下命令使用seq

tmp <- xts(, seq(start(V.a), end(V.a), by='days'))
output <- merge(tmp, V.a, fill=na.locf)

我得到的新数据集看起来像:

2004-02-01     NA     NA
2004-02-01 1.2475 1.2485
2004-02-02 1.2475 1.2485
2004-02-02 1.2430 1.2432
2004-02-03 1.2430 1.2432
2004-02-03 1.2544 1.2546
2004-02-04 1.2544 1.2546
2004-02-04 1.2537 1.2539
2004-02-05 1.2537 1.2539
2004-02-05 1.2563 1.2565
2004-02-06 1.2563 1.2565
2004-02-06 1.2696 1.2706
2004-02-07 1.2696 1.2706
2004-02-08 1.2696 1.2706
2004-02-08 1.2642 1.2652

似乎这些命令给了我每天的开盘价和收盘价,其中开盘价是前一天的收盘价。但是,在日期2004-02-07,只记录了前一天的收盘价。用了还是会错过这个价格

Y.data<-as.data.frame(output)
y<-Y.data$V2
y1<-y[seq(2,length(y),2)] 

提取所有收盘价。

【问题讨论】:

  • 看起来你有一个Date 索引
  • 你试过包装as.POSIXct(start(V.a))
  • 感谢@akrun,它可以工作并返回第一行2004-02-01 13:00:00 NA NA。我想知道是否有办法删除这一行,为什么一直设置为13:01:00
  • 检查你的format字符串,它有斜线而不是-

标签: r xts


【解决方案1】:

你不应该因为这样的原因直接调用方法。如果您只调用泛型 seq 并让它进行方法分派,您的代码就可以正常工作。

您还可以使用merge 及其fill 参数将NA 替换为之前使用na.locf 的值。

而且您无需致电align.time。我不确定您为什么认为需要这样做,但它可能只会导致日常数据出现问题。

tmp <- xts(, seq(start(V.day), end(V.day), by='days'))
output <- merge(tmp, V.day, fill=na.locf)

【讨论】:

  • 我猜这给了我每天的开盘价和收盘价,其中开盘价是前一天的收盘价
  • 请将其编辑到您的问题中。作为评论很难阅读。如果您提供reproducible example,帮助您会容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2022-01-15
  • 2019-07-30
  • 2014-07-17
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多