在R中将字符串转换为日期的最快方法

在R中将字符串转换为日期的最快方法,r,fasttime,R,Fasttime,我想在R中转换大约1亿个字符串形式的日期(例如:“09/20/2019”) 做 a = "09/20/2019" a <- as.Date(a, "%m/%d/%Y") a=“09/20/2019” a使用lubridate 图书馆(lubridate) a=“09/20/2019” mdy(a) 对于此示例数据,使用查找表方法(1)比as.Date快38倍。对于这个示例数据,方法(2)仍然快18倍,如果您没有生成d的好方法,则方法(2)更方便。当然,数据的细节会影响实际

我想在
R
中转换大约1亿个字符串形式的日期(例如:“09/20/2019”)

a = "09/20/2019"       
a <- as.Date(a, "%m/%d/%Y")
a=“09/20/2019”
a使用lubridate


图书馆(lubridate)
a=“09/20/2019”
mdy(a)

对于此示例数据,使用查找表方法(1)比
as.Date
快38倍。对于这个示例数据,方法(2)仍然快18倍,如果您没有生成
d
的好方法,则方法(2)更方便。当然,数据的细节会影响实际实现的加速

# test data
set.seed(123)
d <- format(as.Date("2000-01-01") + 1:100, "%m/%d/%Y")
dd <- sample(d, 1000000, replace = TRUE)

# 1 - lookup table
system.time(as.Date(d, "%m/%d/%Y")[match(dd, d)])
##    user  system elapsed 
##    0.06    0.02    0.07 

# 2 - table lookup generating u on the fly instead of d
system.time({u <- unique(dd); as.Date(u, "%m/%d/%Y")[match(dd, u)] })
## user  system elapsed 
## 0.13    0.03    0.15 

# 3 - as.Date
system.time(as.Date(dd, "%m/%d/%Y"))
##    user  system elapsed 
##    2.61    0.07    2.67 
测试数据 种子集(123)
d由于您提到了
fasttime
,我很想用其他一些常用选项来测试它。它需要年-月-日格式的日期,但您可以使用一些正则表达式来实现这一点

我在一组较小但仍然麻烦的日期上进行基准测试。我在一台有一年历史的MacBook Pro电脑上运行着大量其他东西,在我吃完三明治之前,我还在100万次约会中进行100次试验,所有3种方法都完成了

set.seed(9)
天数基数357.0256180 100 a
#>路伯4 5 6.91 6 148 100 a
#>fast 458.7756332100A
根据平均值和最低最大值,
lubridate::mdy
运行最快,无需重新格式化或指定格式字符串。基于中位数,基本
as.Date
运行最快,但需要您设置格式字符串(不是什么大问题),或者
fasttime
但有regex规定。你想怎么做就怎么做


我还要注意的是,
fasttime
转换成POSIX,因此,由于没有时间元素集,它在删除它时附加一个时间元素,这可能会成为另一个耗时的步骤。

@joran它应该足够快,我在100万个随机日期上测试了
mdy
,只花了0.22秒。@joran需要6层才能到达那里,但我认为最终它使用的是
lubridate:::C_parse_dt
,它可能比使用通用
strtime
as.Date
更快。我对C端了解不够,无法从根本上进行评论,因为预先排序了
dd
的查找表也应该节省一些时间