如何最有效地将字符串“2014 年 1 月 1 日”转换为 POSIXct,即“2014-01-01”yyyy-mm-dd

How to most efficiently convert a character string of "01 Jan 2014" to POSIXct i.e. "2014-01-01" yyyy-mm-dd

我已经对这里的问题有了部分答案,就我所解释的而言:

但是,任务已经扩展,需要处理原始格式的变化。

我有一个大数据集,有一列字符 class 的日期格式为:

01 Jan 2014

或:

dd MMM yyyy

我想将其重组为 fastPOSIXct,它只接受按 POSIXct 顺序输入的字符:

yyyy-mm-dd

上面的链接问题指出,一种有效的方法是使用正则表达式,然后将输出提供给 fast.time。在这里我是否需要扩展它以包含一种方法来理解每月的缩写,转换为数字,然后重新排列?我该怎么做?我知道有一个 month.abb 作为内置常量。我应该使用这个,还是有更聪明的方法?

使用lubridate怎么样:

x <- "01 Jan 2014"
x
[1] "01 Jan 2014"
library(lubridate)
dmy(x)
[1] "2014-01-01 UTC"

当然 lubridate 函数也接受 tz 参数。要查看可接受参数的完整列表,请参阅 OlsonNames()

基准

我决定使用 micro benchmark 包和使用 fasstime 的 lubridate 选项用一些经验数据更新这个答案。

library(micro benchmark)
microbenchmark(dmy(x), times = 10000)
Unit: milliseconds
   expr      min      lq     mean   median      uq     max neval
 dmy(x) 1.992639 2.02567 2.142212 2.041514 2.07153 39.1384 10000

options(lubridate.fasttime = T)

microbenchmark(dmy(x), times = 10000)
Unit: milliseconds
   expr      min      lq     mean   median       uq      max neval
 dmy(x) 1.993326 2.02488 2.136748 2.039467 2.065326 163.2008 10000