【问题标题】:R Convert to date from multiple formatsR从多种格式转换为日期
【发布时间】:2017-04-12 23:29:21
【问题描述】:

我需要将多种格式的日期字符串转换为有效日期。

例如

dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001", "20161101")

> as.Date(dates, format=c("%m-%d-%Y","%Y%m%d"))
[1] "2017-01-01" NA           "2016-12-01" "2016-09-01" NA           "2016-11-01"

两个日期显示为 NA

【问题讨论】:

    标签: r as.date


    【解决方案1】:

    这几乎就是我写的anytime 包:

    R> dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001", 
    +             "20161101")
    R> library(anytime)
    R> anydate(dates)
    [1] "2017-01-01" "2017-02-01" "2016-12-01" "2016-09-01" 
    [5] "2016-10-01" "2016-11-01"
    R> 
    

    可靠地解析任何正常输入并且没有明确的格式来源或其他线路噪音。

    话虽如此,不以年份开始 ISO 样式 会带来潜在的麻烦,所以02-03-2017 可能是 2 月 3 日或 3 月 2 日。我遵循北美惯例,我也考虑过坏了——但它是如此普遍。帮自己一个忙,尝试将输入限制为 ISO 日期,至少 ISO 顺序为 YYYYMMDD。

    【讨论】:

    • 澄清一下,anydate() 优先考虑 mdy 而不是 dmy?
    • 是的。 See the formats,您也可以从内部列出。
    • 我发现这要快一点as.Date(ifelse(grepl("-", dates), as.Date(dates, format = c("%m-%d-%Y")), as.Date(dates, format = c("%Y%m%d"))), origin = "1970-01-01")
    • 有什么方法可以简单地改变原点吗?我发现这个函数非常有用,但由于 Excel 的原因,需要将整数处理为“1899-12-30”时将原点更改为“1899-12-30”。
    • 嗨@Croote 我一个可以。我们将它用作编译时常量,我想我们可以更改它。有了全新的测试层,所以有“成本”。编写一个本地的fromExcel() 助手可能更简单。如果您想跟进打开带有一些示例数据的问题单/
    【解决方案2】:

    我已经尝试过图书馆(任何时候),但是对于大数据不起作用。 然后,我发现这个序列很有用:

    df$Date2 <- format(as.Date(df$Date, format="%m/%d/%Y"), "%d/%m/%y")
    
    df$Date2 <- as.Date(df$Date2,"%d/%m/%y")
    

    它在同一列中的“8/10/2005”和“08/13/05”对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多