将列中的多种日期格式转换为单一形式

use*_*913 2 r date

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

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

我想将所有这些转换为POSIXlt格式的日期"%d/%m/%Y",没有时间信息,也没有"Dead"或没有"Alive"前缀。

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

jba*_*ums 5

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

根据 5 个日期的样本在较大数据集中的代表性,您可以对它们进行一次解析以过滤掉通常为日-月-年的日期。然后,假设其余部分是可疑的 Excel 日期,根据它们的正确来源分别解析它们(警告,这可能取决于创建 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"
Run Code Online (Sandbox Code Playgroud)

AFAIK 你不能省略POSIXlt/POSIXct对象的时间信息,所以如果你想这样做,你可能需要:

as.Date(d)
Run Code Online (Sandbox Code Playgroud)

其格式为%d-%m-%Y(在我的语言环境中),

或者

format(d, '%d/%m/%Y')
Run Code Online (Sandbox Code Playgroud)

这将是character