我有一个csv数据点文件(例如财务报告,实验记录等),我的数据有重复的时间戳。以下是演示此问题的代码:
library(zoo);library(xts)
csv="2011-11-01,50
2011-11-02,49
2011-11-02,48
2011-11-03,47
2011-11-03,46
2011-11-03,45
2011-11-04,44
2011-11-04,43
2011-11-04,42
2011-11-04,41
"
z1=read.zoo(textConnection(csv),sep=',')
w1=to.weekly(z1)
ep=endpoints(z1,"weeks",1)
w1$Volume=period.apply(z1,ep,length)
z2=read.zoo(textConnection(csv),sep=',',aggregate=T)
w2=to.weekly(z2)
ep=endpoints(z2,"weeks",1)
w2$Volume=period.apply(z2,ep,length)
vignette('zoo-faq'),条目1,告诉我aggregate = T摆脱了动物园的烦人警告信息。但随后结果发生了变化:
> w1
z1.Open z1.High z1.Low z1.Close Volume
2011-11-04 50 50 41 41 10
> w2
z2.Open z2.High z2.Low z2.Close Volume
2011-11-04 50 50 42.5 42.5 4
是否有其他方法可以摆脱警告信息,但仍然可以获得与w1相同的结果? (是的,我知道抑制警告(),这是我之前使用的,但我讨厌这个主意。) (我想知道将自定义聚合函数传递给read.zoo,它会返回每天的OHLCV数据......但如果可能的话甚至无法解决。)
答案 0 :(得分:4)
您需要一个函数来填充带有“epsilon”增量的时间戳来制作它们 不同。
我还写了一两个基于Rcpp的函数来做到这一点。毕竟时间往往是POSIXct,它实际上是一个浮点数(在你执行as.numeric
之后),所以只需循环遍历时间戳,并且与前一个相等,继续添加1.0e-7的小delta,这是小于POSIXct本身可以代表的东西。每次实际休息时重置累积增量。
修改:尝试xts包中的make.index.unique()
和make.time.unique()
函数:
R> sametime <- rep(Sys.time(), 3)
R> xts(1:3, order.by=make.time.unique(sametime))
[,1]
2011-12-20 06:52:37.547299 1
2011-12-20 06:52:37.547300 2
2011-12-20 06:52:37.547301 3
R>
编辑2:以下是Date
索引对象的另一个示例:
R> samedate <- rep(Sys.Date(), 5) # identical dates
R> xts(1:5, order.by=make.time.unique(as.POSIXct(samedate)))
[,1]
2011-12-19 18:00:00.000000 1
2011-12-19 18:00:00.000000 2
2011-12-19 18:00:00.000001 3
2011-12-19 18:00:00.000002 4
2011-12-19 18:00:00.000003 5
R> xts(1:5, order.by=as.Date(make.index.unique(as.POSIXct(samedate))))
[,1]
2011-12-20 1
2011-12-20 2
2011-12-20 3
2011-12-20 4
2011-12-20 5
R>
第一个解决方案切换到POSIXct,最终在午夜前六小时结束,因为GMT减去六小时是我当地的时区。第二个示例使用双转换,然后返回Date
---然后变为唯一。
答案 1 :(得分:2)
就像Dirk建议的一个简单变体一样,这应该有效
z0 = read.csv( textConnection(csv), sep=',', header=FALSE )
z1 = zoo( z0$V2, as.Date(z0$V1) + (1:nrow(z0))*10^-10 )