2017-04-25 34 views
4

我试图将两种格式的日期转换为一个单一的日期,我可以很容易地将日期转换为as.Date。这里有一个例子:处理日期正则表达式捕获组输出R

library(dplyr) 
df <- data_frame(date = c("Mar 29 2017 9:30AM", "5/4/2016")) 

我已经试过这样:

df %>% 
    mutate(date = gsub("([A-z]{3}) (\\d{2}) (\\d{4}).*", 
        paste0(which(month.abb == "\\1"),"/\\2","/\\3"), date)) 

但它给了我这样的:

 date 
1 /29/2017 
2 5/4/2016 

但我想这个!

 date 
1 3/29/2017 
2 5/4/2016 

它看起来像当我使用month.abb == "\\1",它不使用捕获组输出("Mar"),它只是使用呼叫者文本("\\1")。如果可能的话,我想在正则表达式中这样做。我知道你可以用另一种方式来做,但想要变得光滑。

任何想法?

+1

'as.Date'可以采取两种形式,即'as.Date(DF $ date,format = c('%b%d%Y%H:%M','%m /%d /%Y'))'(未测试) – Sotos

+0

我想用正则表达式来做。谢谢您的好意。 – Zafar

+1

作为解释:正则表达式查看paste0表达式的结果 - 它从不会看到进入粘贴表达式的值。 – epi99

回答

1

这里有一种方法用在组合gsubfn

library(gsubfn) 
df$date <- gsubfn("^([A-Za-z]{3})\\s+(\\d{2})\\s+(\\d{4}).*", function(x, y, z) 
        paste(match(x, month.abb),y, z, sep="/"), df$date) 
df$date 
#[1] "3/29/2017" "5/4/2016" 

或者subgsubfn

sub("(\\S+)\\s+(\\S+)\\s+(\\S+).*", "\\1/\\2/\\3", 
     gsubfn("^([A-z]{3})", setNames(as.list(1:12), month.abb), df$date)) 
#[1] "3/29/2017" "5/4/2016"