有没有一个快速的日期解析器?

8

对于日期时间,fasttime 提供了非常快速的解析到 POSIXct。

library('fasttime')
library('lubridate')
library('microbenchmark')

# parse character to POSIXct
Sys.setenv(TZ='UTC')
test <- rep('2011-04-02 11:01:00',1e4)
microbenchmark(
  test1 <- fastPOSIXct(test),
  test2 <- fast_strptime(test,format='%Y-%m-%d %H:%M:%S'),
  test3 <- as.POSIXct(test, format='%Y-%m-%d %H:%M:%S'),
  test4 <- ymd_hms(test),
  times=100)
Unit: microseconds
                                                       expr       min        lq      mean    median         uq       max
                                 test1 <- fastPOSIXct(test)   663.123   692.337  1409.448   701.821   712.4965 71231.585
 test2 <- fast_strptime(test, format = "%Y-%m-%d %H:%M:%S")  1026.342  1257.508  1263.157  1264.928  1273.8145  1366.438
    test3 <- as.POSIXct(test, format = "%Y-%m-%d %H:%M:%S")  9865.265 10060.450 10154.651 10145.551 10186.3030 13358.136
                                     test4 <- ymd_hms(test) 13990.206 17152.779 17278.654 17308.347 17393.6625 22193.544

是否有与日期Date等价的东西?lubridate包提供了一些解析器,但 fast_strptime 将日期转换为 POSIXct(不适用于日期)。将 POSIXct 转换为 Date 太长了。

考虑到解析为POSIXct的速度如此之快,我认为应该有一种与Date同样快速的解决方案

是否有一个快速打包的替代品?

1个回答

7

鉴于

## the following two (here three) lines are all of fasttime's R/time.R
fastPOSIXct <- function(x, tz=NULL, required.components = 3L)
  .POSIXct(if (is.character(x)) .Call("parse_ts", x, required.components)
           else .Call("parse_ts", as.character(x), required.components), tz)

因此
## so we suggest to just use it, and convert later
fastDate <- function(x, tz=NULL)
  as.Date(fastPOSIXct(x, tz=tz))

这至少胜过了as.Date()

R> library(microbenchmark)
R> library(fasttime)
R> d <- rep("2010-11-12", n=1e4)
R> microbenchmark(fastDate(d), as.Date(d), times=100)
Unit: microseconds
        expr    min      lq    mean  median      uq     max neval cld
 fastDate(d) 47.469 48.8605 54.3232 55.7270 57.1675 104.447   100  a 
  as.Date(d) 77.194 79.4120 85.3020 85.2585 87.3135 121.979   100   b

R> 

如果你想要快速解决,可以从 tparse.c 开始,创建你想要的仅包含日期的子集。

您的RcppBDT是否能帮助我避免使用C语言? - statquant
1
Boost DateTime中有解析器,但我选择将其公开,因为你需要链接这个库。而我们目前对纯粹的_时间计算_并不需要这个库。而且只需要头文件就可以进行构建和部署,这样更加方便。 - Dirk Eddelbuettel
只是为了让你知道,你不需要粘贴(x,'12:00:00'),它默认情况下可以正常工作(请参阅文档)。 - statquant
正确。当步骤完成时,它停止解析该步骤。这将使这个解决方案更难被击败...修改帖子和数字。 - Dirk Eddelbuettel
刚刚意识到它对结果进行解析,然后调用.POSIXct函数,如果as.Date没有做任何愚蠢的事情,那么确实很难被打败。而且,对于更一般的格式,比如%Y%m%d,使用相同的函数与lubridate中的fast_strptime一起使用也可以。 - statquant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接