R - 将字符串转换为日期

R - Convert strings to dates

我有一个存储为字符串的日期列表,我想将它们转换为日期格式。我面临两个主要问题:

  1. 月-日-年分隔符不一致:有时是_,有时是-
  2. 字符串中月份和日期的位置不一致:有时日期在月份之前,有时则相反。

我想知道是否有一种方法可以编写 regex 以便将下面的三个字符串都转换为日期。

> mydate <- c('Jan_30_2018','April_3-2018','07_June_2018')
> as.Date(mydate,'%B_%d_%Y')
[1] "2018-01-30" NA           NA          
> as.Date(mydate,'%B.%d.%Y')
[1] NA NA NA
> as.Date(mydate,'%B*%d*%Y')
[1] NA NA NA
> as.Date(mydate,'%B+%d+%Y')
[1] NA NA NA
> as.Date(mydate,'%B_%d-%Y')
[1] NA           "2018-04-03" NA   
as.Date(ifelse(grepl("^[A-Z]",mydate),
       as.Date(gsub("_","-",mydate), "%B-%d-%Y"),
       as.Date(gsub("_","-",mydate), "%d-%B-%Y")
       ), origin="1970-01-01")

[1] "2018-01-30" "2018-04-03" "2018-06-07"

更新

这种方法提供了一些不错的速度,以防您的向量 mydate 具有任何合理的大小:

library(data.table)

data.table(d=gsub("_","-",mydate))[
, fifelse(grepl("^[A-Za-z]",d),as.Date(d,"%B-%d-%Y"), as.Date(d,"%d-%B-%Y"))]

正如 @rawr 在一个小时前的评论中所暗示的那样,我的 anytime package 中的 anydate() 函数就是为此而创建的:

  • 不需要格式字符串,但会检查一些可能且合理的格式
  • 不需要向量的所有元素都使用相同的格式
  • 确实使用矢量化和编译操作,所以速度很快

例子

> anytime::anydate(c('Jan_30_2018','April_3-2018','07_June_2018')) 
[1] "2018-01-30" "2018-04-03" "2018-06-07"   
>