我有两组日期查看字符串; 31.3.14
或31/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
函数提供的解决方案失败。
答案 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"