Как разобрать неверную дату с lubridate? - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно разобрать даты, и у меня есть случаи типа "31/02/2018":

library(lubridate)
> dmy("31/02/2018", quiet = T)
[1] NA

Это имеет смысл, поскольку 31 февраля не существует. Есть ли способ разобрать строку "31/02/2018", например, 2018-02-28? Так что не для получения АН, а для фактической даты?

Спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Мы можем написать функцию, предполагая, что у вас будут только даты, которые могут быть выше, чем фактическая дата, и всегда иметь одинаковый формат.

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"

С небольшими изменениями вы можете настроить даты, если они имеют другой формат или даже если некоторые даты меньше первой даты.

...