我在数据框中有一个列,其中包含以多种形式存储的日期信息,例如
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。感谢任何帮助!
答案 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)