【问题标题】:how to standardize mixed date formats in the same column如何标准化同一列中的混合日期格式
【发布时间】:2016-01-16 15:16:03
【问题描述】:

我有一个数据框,其中一列中的数据当前是“字符”,我需要将其更改为“日期”,但是日期是混合格式,所以我不能只使用 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”转换成什么?
  • 关于 Stack Overflow 的好问题不仅指定了您拥有的数据,还指定了预期的输出,因此您应该编辑您的问题,说如果是这种情况,您只需要月/年。所有日期都是 2013 年的吗?否则你怎么知道输入“June”的年份?
  • 我们可以使用虚拟日期和年份,因为我只需要月份,但我需要与其他月份相同的格式 06/06/2013

标签: r date dataframe


【解决方案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"))

【讨论】:

  • 如果您的区域设置未设置为英语(或 6 月表示第 6 个月的任何其他语言),这将返回“六月”NA。试试Sys.getlocale(category = "LC_ALL") 确定。
  • 我的语言环境是 [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF- 8/en_US.UTF-8" @RHA 但是我在“六月”、“五月”等月份得到 NA。
  • 感谢@RHA!这是因为尾随空格吗? @S.Galleg,用Date2 = as.Date(paste0("01-",date,"-2013"), format = "%d-%B -%Y"), 替换第二行有效吗?
  • 注意%B 后面的空格,因为您的字符串格式类似于June ,所以当您将它们粘贴到-2013 时,它看起来像June -2013 而不是June-2013
  • @Jim 用trim 删除这些空格不是更好吗?
【解决方案2】:

答案是你不应该,即使有另一列告诉你它的格式是什么

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

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

【讨论】:

  • 我可以在新列中显示它,但问题仍然存在,如何将“June”转换为 YYYY-MM-DD 格式?
  • 如果没有给出年份,你会使用哪一年?
  • 2013为年份,日期可以是01
猜你喜欢
  • 2014-10-13
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多