在R中格式化两种因子日期

时间:2014-11-25 09:59:09

标签: r

我有两组日期查看字符串; 31.3.1431/3/14

我想将它们格式化为31-3-2014

现在我知道如何将每种格式化为所需的格式,但我不知道如何区分它们并应用下面的方法。

对于此格式31.3.14

  format(as.Date(as.character("31.3.14"), "%d.%m.%y"), "%d-%m-%Y")

对于此格式31/3/14

  format(as.Date(as.character("31/3/14"), "%d/%m/%Y"), "%d-%m-%Y"))

我在数据框列中随机有这种日期,所以我需要为正确的格式集应用给定的方法。

编辑:抱歉,我还有不同类型的日期:"2013-04-01"此处dmy函数提供的解决方案失败。

2 个答案:

答案 0 :(得分:3)

Hadley Wickham的Lubridate套装让这一切变得简单。

> require(lubridate)
> test <- data.frame(raw = c("31.3.14", "31/3/14"))
> test$formatted <- dmy(test$raw)
> test
      raw  formatted
1 31.3.14 2014-03-31
2 31/3/14 2014-03-31

编辑: 根据对问题的编辑,可以在函数中使用ifelse()来检测日期字符串开头的四位数序列。

require(stringr)
myDateFun <- function(x){
  z <- ifelse(str_detect(x, "^\\d{4}") == TRUE,
              ymd(x), dmy(x) )
  z <- as.POSIXlt(z, origin = "1970-01-01")
  z <- format(z, "%Y-%m-%d")
  return(z)
}
test <- data.frame(raw = c("31.3.14", "31/3/14", "2014-3-31"))


test$formatted.2 <- myDateFun(test$raw)
test
        raw  formatted formatted.2
1   31.3.14 2014-03-31  2014-03-31
2   31/3/14 2014-03-31  2014-03-31
3 2014-3-31       <NA>  2014-03-31

答案 1 :(得分:3)

也可以通过首先删除标点符号来执行基础R

Dates <- c("31.3.14", "31/3/14")
format(as.Date(gsub("[[:punct:]]", "-", Dates), format = "%d-%m-%y"), "%d-%m-%Y")
## [1] "31-03-2014" "31-03-2014"