代码之家  ›  专栏  ›  技术社区  ›  MichaelE

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

  •  1
  • MichaelE  · 技术社区  · 6 年前

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

    这是我当前的代码:

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

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

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

    我希望在native 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代码添加了选项字段,以显示最大时差。每天86400秒,每小时3600秒,每分钟60秒,依此类推。

    2 回复  |  直到 6 年前
        1
  •  6
  •   Dirk is no longer here    6 年前

    下面是使用 %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)并对其进行了重新分析。然而 %在% 失败。

    下列的 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> 
    
        2
  •  1
  •   ngm    6 年前

    访问您的 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")