在R中快速将字符转换为日期

10

可能重复:
为什么在字符向量上使用as.Date很慢?

我有一个大的data.frame(大约有6000万个观测值),我使用RMySQL从数据库中读取。由于日期以字符形式呈现(似乎没有改变它们的方法),因此我使用as.Date将其转换为日期格式。然而,由于有这么多的观测值,这需要非常长的时间。有什么方法可以使这个过程更快吗?


将整个表转储为CSV文件,然后使用“scan”以正确的列类别导入表可能会更快。听起来有些俗气,但确实很快。 - nograpes
@nograpes:你知道read.csv是否做了同样的转换吗?这可能不会有影响。 - Alex
@BenBolker:实际上我看了一下,但似乎没有解决方案。OP试图弄清楚是否是data.table的问题...但不是。我有什么遗漏吗? - Alex
@Alex:好观点。我检查了一下,确实是同样的事情。这不会有任何影响。 - nograpes
@Alex:我认为你漏掉了一些东西,如果我正确地阅读了答案的话。Matthew Dowle的答案将问题追溯到了strptime,而OP自己的答案展示了他编写的一些代码,将转换时间缩短了约10倍... - Ben Bolker
显示剩余3条评论
1个回答

21

Simon Urbanek的fasttime库在可解析的日期时间子集上非常快:

R> now <- Sys.time()
R> now
[1] "2012-10-15 10:07:28.981 CDT"
R> fasttime::fastPOSIXct(format(now))
[1] "2012-10-15 05:07:28.980 CDT"
R> as.Date(fasttime::fastPOSIXct(format(now)))
[1] "2012-10-15"
R> 

然而,它仅解析ISO格式并假定时区为UTC。

经过三年半的编辑:一些评论者似乎认为 fasttime 包很难安装。我不这么认为。这里是(再次)使用install.r 的方法,它只是一个简单的包装器,使用littler(也作为示例随附):

edd@max:~$ install.r fasttime
trying URL 'https://cran.rstudio.com/src/contrib/fasttime_1.0-1.tar.gz'
Content type 'application/x-gzip' length 2646 bytes
==================================================
downloaded 2646 bytes

* installing *source* package ‘fasttime’ ...
** package ‘fasttime’ successfully unpacked and MD5 sums checked
** libs
ccache gcc -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -O3 -Wall -pipe -pedantic -std=gnu99  -c tparse.c -o tparse.o
ccache gcc -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o fasttime.so tparse.o -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/fasttime/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (fasttime)

The downloaded source packages are in
        ‘/tmp/downloaded_packages’
edd@max:~$ 

正如您所看到的,该软件包没有任何外部依赖关系,只有一个源文件,并且构建过程非常顺利。我们还可以看到,fasttime现在已经出现在CRAN上了,这在回答撰写时并不是这样。因此,在那个页面上,Windows和OS X二进制文件现在确实存在,即使您不从源代码安装,安装过程也会像我一样轻松。


1
请注意,它仅适用于1970年之后的日期!!这是一个奇怪的限制..可能与POSIX有关? - Alex
4
fasttime需要更新才能与R 3.1一起使用。 - Michael Bishop
1
我相信Michael指的是构建。似乎没有可用于R 3.1.0的二进制文件。 - hendalst
2
你不可能是认真的。CRAN就是这么好用。如果你需要的包不在CRAN上,你只需要安装构建工具即可。 - Dirk Eddelbuettel
@Alex,它只适用于1970年以后的日期,因为Simon正在使用POSIXct变量,该变量定义为自1970-01-01 00:00.000以来的秒数。我相信这在fasttime的文档中有说明。 - Avraham
显示剩余3条评论

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