1

我有一个数据点的 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 摆脱了 zoo 烦人的警告信息。但随后结果发生了变化:

> 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 相同的结果?(是的,我知道suppressWarnings(),这是我以前使用的,但我讨厌这个想法。)(我想知道将自定义聚合函数传递给read.zoo,它将返回每天的OHLCV数据......但如果可能的话,甚至无法解决。)

4

2 回答 2

4

您需要一个函数来用“epsilon”增量填充时间戳以使它们不同。

为此,我还编写了一两个基于 Rcpp 的函数。时间毕竟是最常见的 POSIXct ,它实际上是一个浮点数(在你这样做之后as.numeric),所以只需循环时间戳,并在与前一个相等的情况下继续添加一个 1.0e-7 的小增量,该增量小于 POSIXct 本身可以代表。每次实际休息时重置累积增量。

编辑:尝试xts 包中的make.index.unique()and函数: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--- 这已成为唯一的。

于 2011-12-20T04:32:31.153 回答
2

就像 Dirk 建议的一个简单变体一样,这应该有效

z0 = read.csv( textConnection(csv), sep=',', header=FALSE )
z1 = zoo( z0$V2, as.Date(z0$V1) + (1:nrow(z0))*10^-10 )
于 2011-12-20T08:26:47.980 回答