将表示各种格式化date的string列转换为date列

我正在寻找一种有效的方法来将数据表中的一列string转换为date列,条件是这些string可以是三种date格式之一 – 数字,%Y-%m-%d, %米/%d /%Y。

下面说明一个假设的函数datefun将如何performance:

 library(data.table) dt <- data.table( my_dates = c('42292.7894','2014-06-22','11/25/2011','33661', NA)) datefun(dt$my_dates) [1] "2015-10-15" "2014-06-22" "2011-11-25" "1992-02-27" NA 

这与将string的格式知识应用为每个string的date相同。

  l <- dt$my_dates c( as.Date(as.numeric(l[1]), origin = "1899-12-30"), as.Date(l[2],'%Y-%m-%d'), as.Date(l[3],'%m/%d/%Y'), as.Date(as.numeric(l[4]), origin = "1899-12-30"), as.Date(l[5])) [1] "2015-10-15" "2014-06-22" "2011-11-25" "1992-02-27" NA 

我试图直接从Excel中没有被格式化一致的数据。

lubridate是一个很方便的工具。 我认为关于这个主题的其他问题没有明确处理自起源起的十进制date,所以这里是:

 library(lubridate) d <- parse_date_time(l, c('%Y-%m-%d', '%m/%d/%Y')) d[is.na(d)] <- (ymd_hms("1899-12-30 00:00:00") + as.numeric(l) * 3600 * 24)[is.na(d] d ## [1] "2015-10-15 18:56:44 UTC" "2014-06-22 00:00:00 UTC" "2011-11-25 00:00:00 UTC" ## [4] "1992-02-27 00:00:00 UTC" NA 

这假定任何可以强制为数字的元素都是自原始格式(具有一致的原点)以来的十进制数。