将dd/mm/yy和dd/mm/yyyy转换为Dates

Tom*_*rot 9 regex r lubridate

我有一些字符向量,其中包含各种格式的日期

dates <- c("23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Run Code Online (Sandbox Code Playgroud)

我想将这些转换为日期.我从lubridate包中尝试过非常好的dmy,但这不起作用:

    dmy(dates)
[1] "0012-11-23 UTC" "2012-10-20 UTC" "2012-10-22 UTC" "0012-11-23 UTC"
Run Code Online (Sandbox Code Playgroud)

它将/ 12年视为0012.

所以我现在尝试使用正则表达式来选择每种类型,并使用as.Date()单独转换为日期.但是我试图选择dd/mm/yy的正则表达式不起作用.

dates[grep('[0-9]{2}/[0-9]{2}/[0-9]{2,2}', dates)]
Run Code Online (Sandbox Code Playgroud)

回报

[1] "23/11/12"   "20/10/2012" "22/10/2012" "23/11/12"
Run Code Online (Sandbox Code Playgroud)

我认为{2,2}应该得到正好2个数字,而不是所有数字.我不是很擅长正则表达,所以任何帮助将不胜感激.

谢谢

编辑

我实际拥有的是三种不同类型的日期,如下所示

dates <- c("23-Jul-2013", "23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Run Code Online (Sandbox Code Playgroud)

我想将这些转换为日期

parse_date_time(dates,c('dmy'))
Run Code Online (Sandbox Code Playgroud)

给我

[1] "2013-07-23" "0012-11-23" "2012-10-20" "2012-10-22" "0012-11-23"
Run Code Online (Sandbox Code Playgroud)

然而,这是错误的,0012应该是2012年.我想(一个相当简单的)解决方案.

我现在拥有的一个解决方案(感谢@plannapus)是使用正则表达式我实际上最终创建了这个函数,因为我仍然得到一些情况,其中rubridate方法将12变为0012

    asDateRegex <- function(dates, 
        #selects strings from the vector dates using regexes and converts these to Dates
        regexes = c('[0-9]{2}/[0-9]{2}/[0-9]{4}', #dd/mm/yyyy
            '[0-9]{2}/[0-9]{2}/[0-9]{2}$', #dd/mm/yy
            '[0-9]{2}-[[:alpha:]]{3}-[0-9]{4}'), #dd-mon-yyyy
        orders = 'dmy',
        ...){
        require(lubridate)
        new_dates <- as.Date(rep(NA, length(dates)))
        for(reg in regexes){
            new_dates[grep(reg, dates)] <- as.Date(parse_date_time(dates[grep(reg, dates)], order = orders))
        }
        new_dates
    }

asDateRegex (dates)
[1] "2012-10-20" "2013-07-23" "2012-11-23" "2012-10-22" "2012-11-23"
Run Code Online (Sandbox Code Playgroud)

但这不是很优雅.更好的解决方案?

ags*_*udy 14

您可以使用parse_date_timelubridate:

some.dates <- c("23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
parse_date_time(some.dates,c('dmy'))
[1] "2012-11-23 UTC" "2012-10-20 UTC" "2012-10-22 UTC" "2012-11-23 UTC"
Run Code Online (Sandbox Code Playgroud)

但是,请注意格式的顺序很重要:

some.dates <- c("20/10/2012","23/11/12",  "22/10/2012" ,"23/11/12")
parse_date_time(some.dates,c('dmY','dmy'))

[1] "2012-10-20 UTC" "2012-11-23 UTC" "2012-10-22 UTC" "2012-11-23 UTC"
Run Code Online (Sandbox Code Playgroud)

编辑

内部parse_date_time使用guess_formats(我猜使用一些正则表达式):

guess_formats(some.dates,c('dmy'))
       dmy        dmy        dmy        dmy 
"%d/%m/%Y" "%d/%m/%y" "%d/%m/%Y" "%d/%m/%y" 
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,您可以这样使用parse_date_time:

as.Date(dates, format = guess_formats(dates,c('dmy')))
Run Code Online (Sandbox Code Playgroud)


Ric*_*ton 7

您可以根据日期的输入长度选择格式.

y <- ifelse(nchar(dates) == 8, "y", "Y")
as.Date(dates, format = paste0("%d/%m/%", y))
Run Code Online (Sandbox Code Playgroud)