将表示各种格式化日期的字符串列转换为日期

时间:2016-02-25 22:59:38

标签: r excel date data.table data-conversion

我正在寻找一种高效方式将数据表中的字符串列转换为日期列,条件是字符串可以采用三种日期格式之一 - 数字,%Y-%m-%d,%m /%d /%Y。

以下说明了假设函数datefun的行为:

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 

与将as.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读取数据,而这些数据的格式不一致。

1 个答案:

答案 0 :(得分:1)

lubridate对此非常方便。我认为关于这个主题的其他问题并没有明确处理自起源以来的十进制天数,所以这里是:

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 

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