我试图在R中以相同的方式格式化所有日期的单个列。但是,有很多不同版本的日期。
我已经查看了关于stackoverflow的其他答案,但是没有一个答案包含日期的所有这些版本(例如1999年7月4日):
1999年7月4日
070499
741999
7-4-99
我尝试删除所有的'-'和'/',所以只剩下数字,但是看起来问题出在几天/月只有一个数字。 我尝试过
if(nchar(data$birthday) == 6) (data$birthday = paste0("0", data$birthday))
但这仅在月份用一位数字书写时才能解决问题。
这是我认为最接近的结果,但它仍然会产生错误。
data$newbirthday <- multidate(data$birthday, c("%m%d%Y", "%m%d%y", "%m/%d/%Y", "%m/%d/%y","%m-%d-%Y","%m-%d-%y")
答案 0 :(得分:1)
我会使用lubridate
灵活(并且巧妙地)解析不同的日期格式。
在您的情况下,我们得到
ss <- c(
"7/4/99", "07/04/99", "7/4/1999",
"07/04/1999", "070499", "7499",
"07041999", "741999", "7-4-99",
"07-04-99", "7-4-1999", "07-04-1999")
library(lubridate)
dmy(ss)
#[1] "1999-04-07" "1999-04-07" "1999-04-07" "1999-04-07" "1999-04-07"
#[6] NA "1999-04-07" NA "1999-04-07" "1999-04-07"
#[11] "1999-04-07" "1999-04-07"
#Warning message:
# 2 failed to parse.
剩下的是2个(含糊的)日期,这些日期为NA
。请注意,lubridate::dmy
识别的所有日期都是正确的。
这里的坏人是"7499"
和"741999"
,两者模棱两可;例如,考虑"11199"
:应该是“ 1999年1月11日”还是“ 1999年11月1日”?没有办法告诉。与"1111999"
同上。
实际上,lubridate
返回NA
是正确的结果,因为无法(也不应该)解析这些日期。