将列中的多个日期格式转换为单个表单

时间:2015-02-17 14:55:30

标签: r date

我在数据框中有一个列,其中包含以多种形式存储的日期信息,例如

dob <- c("18/02/1983","36782","01/11,1999 11:55",
         "Dead 12/12/2001","Alive 03/07/1985")

我想将所有这些转换为格式POSIXlt的{​​{1}}日期,没有时间信息,并且没有"%d/%m/%Y""Dead"作为前缀。< / p>

所有先前针对类似问题的解决方案只涉及两种可能的格式,我可以告诉,而我有更多,而且我还有转换5位数字格式日期的问题(我认为这是数字日期与1970年 - 01-01来自Excel)也。我正在使用R-3.1.2。感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

就日期格式而言,

lubridate是灵活的。

根据您的5个日期样本的代表性与较大数据集的代表性,您可以解析它们一次以过滤掉通常为日 - 月 - 年的样本。然后,假设其余部分是狡猾的Excel日期,根据它们的正确来源单独解析它们(警告词,这可能depend on which OS创建了Excel文件。)

library(lubridate)
d <- parse_date_time(dob, c('%d%m%y', '%d%m%y %H%M'))
d[is.na(d)] <- as.POSIXct(as.Date(as.numeric(dob[is.na(d)]), 
                                  origin = "1899-12-30"))

d

## [1] "1983-02-18 00:00:00 UTC" "2000-09-13 00:00:00 UTC" "1999-11-01 11:55:00 UTC"
## [4] "2001-12-12 00:00:00 UTC" "1985-07-03 00:00:00 UTC"

AFAIK您无法忽略POSIXlt / POSIXct个对象的时间信息,因此如果您想这样做,则可能需要:

as.Date(d)

将采用%d-%m-%Y格式(在我的语言环境中),

format(d, '%d/%m/%Y')

将是character

答案 1 :(得分:1)

对此没有简单或简单的解决方案,您必须至少手动完成这些格式。但是说,解决方案的伪代码将是这样的:

tmp <- grepl('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', dob))
formats[tmp] <- '%d/%m/%Y'
tmp <- grepl( other format, dob)
formats[tmp] <- 'other format'
etc...
dates <- strptime(dob, formats)