【问题标题】:Converting multiple date formats in a column to a single form将列中的多种日期格式转换为单个表单
【发布时间】:2015-04-18 07:28:54
【问题描述】:

我在数据框中有一列,其中包含以多种形式存储的日期信息,例如

dob <- c("18/02/1983","36782","01/11,1999 11:55",
         "Dead 12/12/2001","Alive 03/07/1985")

我想将所有这些转换为POSIXlt 格式的"%d/%m/%Y" 日期,没有时间信息,也没有"Dead""Alive" 前缀。

以前所有类似问题的解决方案都只涉及两种可能的格式,我可以说,而我有更多,而且我还有转换 5 位数字格式日期的问题(我认为这是起源于 1970 年的数字日期- 01-01 来自 Excel)也。我正在使用 R-3.1.2。任何帮助将不胜感激!

【问题讨论】:

  • 您需要了解您的源数据,因为有些日期会不明确。例如,是"01/11,1999" 1999 年 11 月 1 日;还是 1999 年 1 月 11 日?
  • 您的 Excel 日期可能有问题(请参阅here
  • 他们都是%d/%m/%Y,幸好!

标签: r date


【解决方案1】:

对此没有简单或简单的解决方案,您至少必须手动检查格式。但话说回来,解决方案的伪代码是这样的:

tmp <- grepl('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', dob))
formats[tmp] <- '%d/%m/%Y'
tmp <- grepl( other format, dob)
formats[tmp] <- 'other format'
etc...
dates <- strptime(dob, formats)

【讨论】:

    【解决方案2】:

    lubridate 在日期格式方面很灵活。

    根据您的 5 个日期样本在较大数据集中的代表性,您可以对它们进行一次解析,以过滤掉那些通常是日-月-年的样本。然后,假设其余的是不可靠的 Excel 日期,根据它们的正确来源分别解析它们(警告,这可能是 depend on which OS 创建 Excel 文件)。

    library(lubridate)
    d <- parse_date_time(dob, c('%d%m%y', '%d%m%y %H%M'))
    d[is.na(d)] <- as.POSIXct(as.Date(as.numeric(dob[is.na(d)]), 
                                      origin = "1899-12-30"))
    
    d
    
    ## [1] "1983-02-18 00:00:00 UTC" "2000-09-13 00:00:00 UTC" "1999-11-01 11:55:00 UTC"
    ## [4] "2001-12-12 00:00:00 UTC" "1985-07-03 00:00:00 UTC"
    

    AFAIK 你不能省略来自POSIXlt/POSIXct 对象的时间信息,所以如果你想这样做,你可能需要:

    as.Date(d)
    

    这将是%d-%m-%Yformat(在我的语言环境中),

    format(d, '%d/%m/%Y')
    

    这将是character

    【讨论】:

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