如何在R中将多个日期格式格式化为一个?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在R中将多个日期格式格式化为一个?相关的知识,希望对你有一定的参考价值。

我试图在R中以相同的方式将一列日期全部格式化。但是,有很多不同版本的日期。

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

  • 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

我已经尝试删除所有' - '和'/',所以我只剩下数字,但看起来问题是天数/月只有一位数。我试过了

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和07-04-99
  • 但是有两个版本将年份改为2019年:07/04/1999和07-04-1999
  • 两个版本是NA:741999 7499
答案

我会使用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是正确的结果,因为这些日期不能(也不应该)解析。

以上是关于如何在R中将多个日期格式格式化为一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何在IOS中将日期格式化为字符串,如“一天前”、“分钟前”?

如何在 Swift 中将此日期字符串格式“2018-03-30T14:36:10.093”格式化为日期 [重复]

如何在 Go 中将时间戳格式化为 GMT?

在单元格中将日期格式化为 yyyy-mm-dd

在 MySQL 查询中将字符串格式化为日期

在 iOS 中将日期格式化为 dd-MMM