【问题标题】:Convert serial date转换序列日期
【发布时间】:2020-06-04 01:53:49
【问题描述】:

我在阅读 excel 时遇到问题。正在读取带有日期的列,其中一些单元格连续读取,其他单元格读取如下日期。

date<-c("43942", "43945", "43952", "17/05/2020", "17/05/2020",
        "18/05/2020", "19/05/2020", "18/05/2020", "22/05/2020")

如何将下面的向量转换为日期?我把它作为一个字符串,因为这是我要转换的列在阅读后的样子。

命令

as.Date(date, origin = "1899-12-30")

返回错误和

as.Date(as.numeric(date), origin = "1899-12-30")

在 NA 中转换非序列日期。

【问题讨论】:

    标签: r date


    【解决方案1】:

    您可以按任意顺序分两步处理此问题。

    将数字转换为日期

    new_date <- as.Date(as.numeric(date), origin = "1899-12-30")
    

    这将为无法转换为数字的日期返回警告。

    使用"dmy" 格式转换剩余日期

    new_date[is.na(new_date)] <- as.Date(date[is.na(new_date)], "%d/%m/%Y")
    #Or using lubridate's dmy
    #new_date[is.na(new_date)] <- lubridate::dmy(date[is.na(new_date)])
    
    new_date
    #[1] "2020-04-21" "2020-04-24" "2020-05-01" "2020-05-17" "2020-05-17" "2020-05-18"
    #[7] "2020-05-19" "2020-05-18" "2020-05-22"
    

    【讨论】:

    • 当日期列中没有错误或NA 时,读数已经采用日期格式2020-06-05,并且应用as.Date 会使日期不正确,例如4354988-02-24。我该怎么做才能仅在必要时应用此格式?当is(date) == "POSIXct"FALSE 时应用格式会是一个好的解决方案吗?
    • 您有多种日期格式吗?所以你说你有“2020-06-05”、“18/05/2020”以及像“43942”这样的数字?在这种情况下,您可以查看lubridate 中的parse_date_time 函数,它允许您传递多种格式。
    • 我有几个 excel 文件,正在尝试自动读取它们。有许多拼写错误会导致读取日期时出错。错误条目的非详尽列表:06/05/202、05/30 或 05/31、06/052020。当一个单元格不是日期格式时,R 会将其他单元格转换为串行,有时 excel 中的格式为串行,R 无法读取。我们的想法是在必要时正确读取和更正大多数日期,其余日期在必要时稍后更正。
    【解决方案2】:

    我们可以在没有任何警告的情况下使用grepl

    i1 <- grepl("^[0-9]+$", date)
    newdate <- as.Date(rep(NA, length(date)))
    newdate[i1] <- as.Date(as.numeric(date[i1]), origin = "1899-12-30")
    newdate[!i1] <- as.Date(date[!i1], "%d/%m/%Y")
    newdate
    #[1] "2020-04-21" "2020-04-24" "2020-05-01" "2020-05-17" "2020-05-17" 
    #[6] "2020-05-18" "2020-05-19" "2020-05-18" "2020-05-22"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多