R/zoo:处理非唯一索引项但不丢失数据?

R/zoo:处理非唯一索引项但不丢失数据?,r,zoo,R,Zoo,我有一个数据点的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(textConnectio

我有一个数据点的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数据。。。但甚至无法确定这是否可行。

您需要一个函数,用epsilon增量填充时间戳,以使其生效 不一样

为此,我还编写了一两个基于Rcpp的函数。毕竟,时间通常是POSIXct,在您执行as.numeric之后,它实际上是一个浮点,因此只需在时间戳上循环,在与前一个时间戳相等的情况下,继续添加一个1.0e-7的小增量,该增量小于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> 

第一个解决方案切换到POSIXct,它在午夜前6小时结束,因为GMT减去6小时是我的本地时区。第二个示例使用了一个双重转换,即“离开”和“返回”到最新,然后将其设置为唯一的。

您需要一个函数,用epsilon增量填充时间戳,以使其成为唯一的时间戳 不一样

为此,我还编写了一两个基于Rcpp的函数。毕竟,时间通常是POSIXct,在您执行as.numeric之后,它实际上是一个浮点,因此只需在时间戳上循环,在与前一个时间戳相等的情况下,继续添加一个1.0e-7的小增量,该增量小于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> 

第一个解决方案切换到POSIXct,它在午夜前6小时结束,因为GMT减去6小时是我的本地时区。第二个例子使用了一个双重转换,它是唯一的。正如Dirk建议的一个简单变体,这应该是可行的

z0 = read.csv( textConnection(csv), sep=',', header=FALSE )
z1 = zoo( z0$V2, as.Date(z0$V1) + (1:nrow(z0))*10^-10 )

正如德克建议的一个简单变体,这应该是可行的

z0 = read.csv( textConnection(csv), sep=',', header=FALSE )
z1 = zoo( z0$V2, as.Date(z0$V1) + (1:nrow(z0))*10^-10 )

谢谢你,德克。你怎么把它和read.zoo放在一起?我刚刚试着在读取后和创建xts或zoo对象之前修改POSIXct列,因此我不使用read.zoo.See我的编辑我的答案:make.time.unique来自xts帮助。Hello@Dirk我在尝试你的代码时得到了这个结果:UseMethodmake.index.unique中的错误:没有适用于“make.index.unique”的方法应用于c'POSIXct类的对象,“POSIXt”我在xts和zoo的2.13.1版本上;这有关系吗?我刚刚检查了我的XTS的非当前SVN签出,该功能已于2011年1月添加,此后有多个XTS版本。你在运行哪个版本?谢谢,德克。你怎么把它和read.zoo放在一起?我刚刚试着在读取后和创建xts或zoo对象之前修改POSIXct列,因此我不使用read.zoo.See我的编辑我的答案:make.time.unique来自xts帮助。Hello@Dirk我在尝试你的代码时得到了这个结果:UseMethodmake.index.unique中的错误:没有适用于“make.index.unique”的方法应用于c'POSIXct类的对象,“POSIXt”我在xts和zoo的2.13.1版本上;这有关系吗?我刚刚检查了我的XTS的非当前SVN签出,该功能已于2011年1月添加,此后有多个XTS版本。您运行的是什么版本?这太粗糙了,因为您一直在不需要添加的地方添加,而B1E-10太小,所以POSIXct仍然将其视为等效版本。@Dirk,但它似乎和to.weeklyz1一样工作。它也可以这样表达:z1好像我误读了——这些是日期而不是POSIXct。我只关心相同的毫秒,在1e-7附近添加一个小ε确实有帮助。以整数表示的日期必须翻转为双精度,其中1e-10确实可以表示。z2=zooz0$V2,因为.POSIXctz0$V1+1:nrowz0*3.0e-7或z2=read.ZooTextConnectionsSV,sep=',,FUN=functionx as.POSIXctx+seq_alongx*3e-7工作得很好,但3.0e-7仍然给出了zoo警告。如果输入一行中的高行数,可能会出现一些潜在问题。我仍然认为该方法太脏,因为偏移量相当差。有关日期类型的示例,请参见“我的答案”的另一个编辑。这太粗糙了,因为您一直在不需要添加的地方添加,而b 1e-10太小,所以POSIXct仍将其视为等效项。@Dirk,但它似乎与to.weeklyz1一样有效。它也可以这样表达:z1好像我误读了——这些是日期而不是POSIXct。我是唯一一个清醒的人
用相同的毫秒表示,在1e-7附近增加一个小ε确实有帮助。以整数表示的日期必须翻转为双精度,其中1e-10确实可以表示。z2=zooz0$V2,因为.POSIXctz0$V1+1:nrowz0*3.0e-7或z2=read.ZooTextConnectionsSV,sep=',,FUN=functionx as.POSIXctx+seq_alongx*3e-7工作得很好,但3.0e-7仍然给出了zoo警告。如果输入一行中的高行数,可能会出现一些潜在问题。我仍然认为该方法太脏,因为偏移量相当差。有关日期类型的示例,请参见“我的答案”的另一个编辑。