【问题标题】:How to most efficiently convert a character string of "01 Jan 2014" to POSIXct i.e. "2014-01-01" yyyy-mm-dd如何最有效地将字符串“01 Jan 2014”转换为 POSIXct,即“2014-01-01”yyyy-mm-dd
【发布时间】:2015-06-19 12:48:03
【问题描述】:

我已经对这里的问题有了部分答案,就其解释而言,我理解:How to most efficiently restructure a character string for fasttime in data.table

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

我有一个大型数据集,其中有一列字符类的日期,格式为:

01 Jan 2014

或:

dd MMM yyyy

我想重组以输入fastPOSIXct,它只接受POSIXct顺序的字符输入:

yyyy-mm-dd

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

【问题讨论】:

标签: regex r date posixct


【解决方案1】:

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

【讨论】:

  • fasttime 选项是否仅适用于 posix 字符串?因此观察到的时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多