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

R 将列中的多个日期格式转换为单个格式,r,date,R,Date,我在数据框中有一列,其中包含以多种形式存储的日期信息,例如 dob <- c("18/02/1983","36782","01/11,1999 11:55", "Dead 12/12/2001","Alive 03/07/1985") dob这个问题没有简单的解决方案,你至少要手工检查一下格式。但是如果这样说的话,解决方案的伪代码应该是这样的: tmp <- grepl('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', d

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

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

dob这个问题没有简单的解决方案,你至少要手工检查一下格式。但是如果这样说的话,解决方案的伪代码应该是这样的:

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)

就日期格式而言,
tmp
lubridate
是灵活的

根据5个日期的样本在更大数据集中的代表性,您可以对它们进行一次解析,以过滤掉通常是日-月-年的日期。然后,假设其余的是不可靠的Excel日期,根据它们的正确来源(警告,这可能是创建Excel文件的时间)

将采用
%d-%m-%Y
格式(在我的区域设置中)


这将是
字符

您需要了解您的源数据,因为某些日期将是不明确的。例如,is
“01/111999”
1999年11月1日;或者1999年1月11日?您的Excel日期可能有问题(请参阅),幸运的是,它们都是%d/%m/%Y!
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"
as.Date(d)
format(d, '%d/%m/%Y')