将列中的多种日期格式转换为单一形式
Converting multiple date formats in a column to a single form
我在数据框中有一列,其中包含以多种形式存储的日期信息,例如
dob <- c("18/02/1983","36782","01/11,1999 11:55",
"Dead 12/12/2001","Alive 03/07/1985")
我想将所有这些转换为格式为 "%d/%m/%Y"
的 POSIXlt
日期,没有时间信息,也没有 "Dead"
或 "Alive"
前缀.
所有以前的类似问题的解决方案都只涉及两种可能的格式,我可以告诉,而我有更多,而且我有转换 5 位数字格式日期的问题(我认为这是带有原点的数字日期1970-01-01 来自 Excel) 也。我正在使用 R-3.1.2。如有任何帮助,我们将不胜感激!
对此没有简单或简单的解决方案,您至少必须手动检查格式。但是说,解决方案的伪代码是这样的:
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)
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
。
我在数据框中有一列,其中包含以多种形式存储的日期信息,例如
dob <- c("18/02/1983","36782","01/11,1999 11:55",
"Dead 12/12/2001","Alive 03/07/1985")
我想将所有这些转换为格式为 "%d/%m/%Y"
的 POSIXlt
日期,没有时间信息,也没有 "Dead"
或 "Alive"
前缀.
所有以前的类似问题的解决方案都只涉及两种可能的格式,我可以告诉,而我有更多,而且我有转换 5 位数字格式日期的问题(我认为这是带有原点的数字日期1970-01-01 来自 Excel) 也。我正在使用 R-3.1.2。如有任何帮助,我们将不胜感激!
对此没有简单或简单的解决方案,您至少必须手动检查格式。但是说,解决方案的伪代码是这样的:
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)
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
。