如何用lubridate解析无效日期?

时间:2018-11-09 12:49:00

标签: r lubridate

我需要分析日期,并遇到类似“ 31/02/2018”这样的情况:

loadChildren: './dashboard/dashboard.module#DashboardModule'

这很有意义,因为2月31日不存在。有没有一种方法可以将字符串“ 31/02/2018”解析为例如2018-02-28所以不是要得到一个NA,而是一个实际的日期?

谢谢。

1 个答案:

答案 0 :(得分:1)

我们可以编写一个函数,假设您只拥有比实际日期高的日期,并且始终具有相同的格式。

library(lubridate)

get_correct_date <- function(example_date) {
  #Split vector on "/" and get 3 components (date, month, year)
  vecs <- as.numeric(strsplit(example_date, "\\/")[[1]])

  #Check number of days in that month
  last_day_of_month <-  days_in_month(vecs[2])

  #If the input date is higher than actual number of days in that month
  #replace it with last day of that month
  if (vecs[1] > last_day_of_month)
    vecs[1] <- last_day_of_month

  #Paste the date components together to get new modified date
  dmy(paste0(vecs, collapse = "/"))
}


get_correct_date("31/02/2018")
#[1] "2018-02-28"

get_correct_date("31/04/2018")
#[1] "2018-04-30"

get_correct_date("31/05/2018")
#[1] "2018-05-31"

通过小的修改,您可以调整日期,如果它们的格式不同,或者某些日期小于第一个日期。