如何快速检查大型XTS对象中是否存在日期(或时间)?

时间:2018-04-05 14:30:13

标签: r rcpp xts zoo

我在R中有一个非常大的xts对象,名为Data,每行有10或100行,每天有数百万行。

这是我目前的代码:

Data #my xts data set.

myDate <- "2018-02-15"
if(nrow(Data[as.character(myDate)]) > 0)
   #Run code.

问题是1天的子集有数百万行并且需要花费大量时间,特别是如果我检查很多日期。

有没有办法可以检查是否存在日期,或者只是第一次出现日期,这样我就不会浪费时间提取大量数据?

我想在原生R中这样做,但最受欢迎的是Rcpp解决方案。

谢谢。

编辑: 根据ngm的回答,我能够完成一个Rcpp解决方案。

// [[Rcpp::export]]
bool doesDateExist(const Rcpp::NumericMatrix& Data, double startDate, double maxDiff = 86400)
{
  double endDate = startDate + maxDiff;
  NumericVector time = Data.attr("index");
  for(int ii = 0; ii < Data.nrow();ii++)
  {
     if(time(ii) >= startDate)
     {
       if(time(ii) < endDate)
          return true;
       else
         return false;
     }
  }
  return false;
}

使用它我有:

myDate <-as.POSIXct("2018-02-15", tz = indexTZ(Data))
if(doesDateExist(Data, myDate, 86400))
   #Run code.

as.POSIXct是我一直忘记的遗失的部分。

编辑:为rcpp代码添加了ptional字段以获得最大时差。白天为86400秒,小时为6000小时,依此类推。

2 个答案:

答案 0 :(得分:5)

以下是使用%in%的反例:

R> x <- xts(1:20, 
+           order.by=Sys.time() + cumsum(sample(1:10, 20, TRUE)*1e-6))
R> x
                           [,1]
2018-04-05 12:09:12.818800    1
2018-04-05 12:09:12.818805    2
2018-04-05 12:09:12.818809    3
2018-04-05 12:09:12.818810    4
2018-04-05 12:09:12.818819    5
2018-04-05 12:09:12.818827    6
2018-04-05 12:09:12.818832    7
2018-04-05 12:09:12.818837    8
2018-04-05 12:09:12.818843    9
2018-04-05 12:09:12.818847   10
2018-04-05 12:09:12.818848   11
2018-04-05 12:09:12.818849   12
2018-04-05 12:09:12.818858   13
2018-04-05 12:09:12.818867   14
2018-04-05 12:09:12.818872   15
2018-04-05 12:09:12.818877   16
2018-04-05 12:09:12.818881   17
2018-04-05 12:09:12.818888   18
2018-04-05 12:09:12.818889   19
2018-04-05 12:09:12.818890   20
R> reftime <- anytime::anytime("2018-04-05 12:09:12.818832")
R> reftime
[1] "2018-04-05 12:09:12.818831 CDT"
R> reftime %in% index(x)
[1] FALSE
R> 

我实际上复制并粘贴了一个随机条目(值为7)并重新解析它。然而%in%失败了。

关注R FAQ 7.31可以执行类似

的操作
R> which( abs(reftime - index(x)) < 1e-6)
[1] 7
R> 
R> x[which( abs(reftime - index(x)) < 1e-6)]
                           [,1]
2018-04-05 12:09:12.818832    7
R> 

答案 1 :(得分:1)

直接访问xts对象的索引会更快。

看起来您正在尝试查看特定日期是否包含在xts对象的索引的日期部分中。这对我有用:

library(xts)
data(sample_matrix)
sample.xts <- as.xts(sample_matrix, descr='my new xts object')

myDate <- as.POSIXct("2007-01-04")

myDate %in% as.POSIXct(index(sample.xts), format="%Y-%m-%d")