如何标准化同一列中混合的日期格式

3

我有一个数据框,其中一列的数据目前是"字符",我需要将它更改为"日期",但是日期格式混合在一起,所以不能只使用as.Date()。此外,该列中还有空行。以下是数据样例:

> head(FarmersMkt$StartDate,n = 50)
 [1] "June "       "January "    "05/01/2013 " "July "       "06/17/2013 "   "05/04/2013 " ""            "06/27/2013 "
 [9] "June "       ""            "06/29/2013 " "06/06/2013 " ""                "May "        ""            ""           
[17] "05/11/2013 " "01/01/2013 " ""            "June "       "June "           "06/06/2013 " ""            ""           
[25] ""            "04/20/2013 " ""            ""            "05/11/2013 "     ""            "01/01/2013 " "01/01/2013 "
[33] "06/06/2013 " "May "        "06/23/2013 " "01/01/2013 " "June 17, 2012 "        "June "       ""            ""           
[41] "06/06/2013 " ""            "May "        ""            ""                ""            "04/20/2013 " "01/01/2013 "
[49] "07/13/2013 " "" 

所有人的年份应为2013年,日期可以是虚假数据。我如何将该列中的数据转换为日期格式?


你想将“June”转换成什么? - josliber
2
在 Stack Overflow 上提出好问题时,不仅要说明你所拥有的数据,还要说明期望的输出结果,因此如果只需要月份/年份,您应该编辑您的问题以表明这一点。所有的日期都是来自2013年吗?否则,如果输入是“六月”,你怎么知道年份呢? - josliber
我们可以使用虚拟日期和年份,因为我只需要月份,但需要与其他日期以相同的格式06/06/2013呈现。 - S.Galleg
2个回答

1

假设您知道观察年份,并且可以将“六月”映射到标准化的日期,例如“2013-06-01”(将月份设置为第一天),那么我会采取以下方法生成两列新数据。第一列将“%m/%d/%Y”格式转换为标准日期,第二列将“%B”转换为标准日期。然后将它们合并在一起。因此,大致如下:

library(dplyr)

tt <- data.frame(date = c("June", "05/23/2013"))

tt %>% mutate(Date1 = as.Date(date, format = "%m/%d/%Y"),
          Date2 = as.Date(paste0("01-",date,"-2013"), format = "%d-%B-%Y"),
          newdate = ifelse(is.na(Date1), Date2, Date1) %>% as.Date(origin = "1970-01-01"))

如果您的语言环境不是英语(或任何将六月定义为第六个月的语言),则此代码将返回“NA”作为“June”。请尝试使用Sys.getlocale(category = "LC_ALL")确认您的语言环境。 - RHA
感谢@RHA!这是因为空格吗?@S.Galleg,将第二行替换为Date2 = as.Date(paste0("01-",date,"-2013"), format = "%d-%B -%Y"),可以解决问题吗? - Jim
@Jim 用 trim 去掉这些空格不是更好吗? - RHA
我明白了,我会尝试的。谢谢。 - S.Galleg
那对我没用,仍然得到<NA>。我想出了一种用for循环的方法来解决它。感谢@RHA两位的帮助。 - S.Galleg
显示剩余3条评论

0

答案是不应该这样做,即使有另一列告诉您格式是什么

您如何解释06/08/2010 1)2010年6月8日 2)2010年8月6日

我总是会转换为标准格式,以便可以对其进行计算,然后存储。如果我必须始终以不同的方式显示它,那么我将拥有另一列告诉我如何显示它。


我可以在新列中显示它,但问题仍然是如何将“June”转换为YYYY-MM-DD格式? - S.Galleg
如果没有给出年份,你会使用哪一年? - easports611
2013年的日期可以是01。 - S.Galleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接