如何将多种日期格式格式化为R中的一种?

时间:2019-03-27 10:35:07

标签: r date

我试图在R中以相同的方式格式化所有日期的单个列。但是,有很多不同版本的日期。

我已经查看了关于stackoverflow的其他答案,但是没有一个答案包含日期的所有这些版本(例如1999年7月4日):

  • 7/4/99
  • 99/04/07
  • 7/4/1999
  • 1999年7月4日

  • 070499

  • 7499
  • 07041999
  • 741999

  • 7-4-99

  • 07-04-99
  • 7-4-1999
  • 1999年7月4日

我尝试删除所有的'-'和'/',所以只剩下数字,但是看起来问题出在几天/月只有一个数字。 我尝试过

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")    
  • 该格式的结果可以很好地使用两个版本:07/04/99和99-04--04-
  • 但是有两个版本将年份切换到2019年:07/04/1999和07-04-1999
  • 两个版本均为NA:741999 7499

1 个答案:

答案 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是正确的结果,因为无法(也不应该)解析这些日期。