是否有一个快速的日期解析器
Is there a fast parser for date
对于日期时间 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 一样快的东西
是否有快速打包的替代品?
给出
## 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 开始创建您想要的仅限日期的子集。
对于日期时间 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 一样快的东西
是否有快速打包的替代品?
给出
## 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 开始创建您想要的仅限日期的子集。