【问题标题】:Fixing mixed date formats in data frame? [duplicate]修复数据框中的混合日期格式? [复制]
【发布时间】:2015-09-15 19:31:48
【问题描述】:

我的数据框中的一列如下所示:

> head(df$col2,n = 50)
 [1] "NA, 2015"           "November 13, 2014"  "September 27, 2014" "October 8, 2014"    "December 16, 2013" 
 [6] "February 8, 2015"   "November 2, 2014"   "November 30, 2014"  "February 18, 2015"  "August 22, 2014"   
[11] "October 26, 2014"   "January 3, 2014"    "May 5, 2015"        "February 3, 2014"   "October 15, 2014"  
[16] "September 12, 2014" "April 2, 2014"      "April 23, 2015"     "November 4, 2014"   "January 16, 2014"  
[21] "September 28, 2014" "January 14, 2014"   "February 13, 2014"  "January 17, 2014"   "January 4, 2014"   
[26] "February 1, 2015"   "January 14, 2014"   "April 18, 2014"     "October 14, 2014"   "August 20, 2014"   
[31] "January 20, 2014"   "April 11, 2015"     "July 5, 2014"       "November 29, 2013"  "March 22, 2014"    
[36] "December 29, 2014"  "February 18, 2015"  "January 13, 2014"   "January 5, 2015"    "April 19, 2014"    
[41] "November 28, 2014"  "13 August, 2014"    "14 December, 2014"  "10 January, 2014"   "3 February, 2014"  
[46] "17 March, 2014"     "3 July, 2014"       "17 October, 2014"   "28 January, 2014"   "10 October, 2014"

如您所见,除了第一行(我知道是 NA,这没问题)之外,m-d-y 和 d-m-y 之间还有两种不同的日期格式。是否有推荐的方法将所有日期标准化为 m-d-y?

在我的这个数据框的列中,它们都被列为字符格式。我试过了

> datestest <- as.Date(df$col2),

但我明白了

Error in charToDate(x) : character string is not in a standard unambiguous format

结果。

【问题讨论】:

  • 这些是所有组合还是可能有其他组合?
  • 我发布了一个应该解决问题的解决方案。使用dput 的数据可以更轻松地为您提供帮助。无论如何,在我的解决方案中,我猜你必须使用 x 而不是 df$col2
  • @Elin:就这两个

标签: r


【解决方案1】:

lubridate 中的 parse_date_time 函数允许您使用“orders”参数解析具有异构格式的向量:

require(lubridate)
x <- c("November 2, 2014", "13 August, 2014")

parse_date_time(x, orders = c("mdy", "dmy"))
[1] "2014-11-02 UTC" "2014-08-13 UTC"

【讨论】:

  • 我喜欢这个解决方案! +1
【解决方案2】:

这是lubridate的解决方案:

library(lubridate)
x <- c("November 2, 2014", "13 August, 2014" )

它包括使用grep 选择不同的日期显示方式(例如,首先使用以数字开头的日期,然后使用- 选择其他日期),然后使用@987654325 的不同适当功能@。

 ind <- grep("^\\d", x)
 dmy(x[ind])
[1] "2014-08-13 UTC"

 mdy(x[-ind])
[1] "2014-11-02 UTC"

【讨论】:

    【解决方案3】:

    我似乎记得有一种更简洁的方法可以使用lubridate 完成此操作,但我不记得它是什么了。过去,我使用类似

    的方式识别日期格式
    date_type <- ifelse(grepl(df$col2, "\\w{3,9} \\d{1,2}, \\d{4}"), "mdy",
                        ifelse(grepl(df$cols, "\\d{1,2} \\w{3,9}, \\d{4}"), "dmy",
                               NA))
    

    从那里,您可以运行另一个 ifelse 来转换日期

    date <- ifelse(date_type == "mdy", 
                   as.Date(df$col2, format = "%B %d, %Y"),
                   as.Date(df$col2, format = "%d %B, %Y"))
    

    这可能会返回一个数字,但您可以将其转换为 as.Date(date, origin = "1970-01-01")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多