在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
的查找表也应该节省一些时间