Как преобразовать смешанный числовой формат и формат даты в формат единственного числа

#r #lubridate

Вопрос:

У меня есть столбец даты из набора данных, импортированного из excel, который содержит сочетание числовых дат и дат dmY. В настоящее время этот столбец структурирован как символ. Я хотел бы отформатировать это в столбец даты Ymd.

Так, например

 dates <- c(25678, 34758, 32474, 23443, "02/06/1999")

date_data <- data.frame(data = dates)

#hopeful end product
"1970-04-20" "1995-02-28" "1988-11-27" "1964-03-07", "1999-06-02"
 

Все эти даты используют происхождение «1899-12-30» из excel

Я пробовал возиться с лубридатом parse_date_time , но безуспешно.

Ответ №1:

Это проверяет формат даты и применяет соответствующее преобразование. Если вы столкнетесь с большим количеством форматов, вам понадобится больше других «если», по одному для каждого формата, который у вас есть.

Данные:

 dates <- c(25678, 34758, 32474, 23443, "02/06/1999")

dates
[1] "25678"      "34758"      "32474"      "23443"      "02/06/1999"
 
 as.vector(sapply( dates, function(x){
  if( grepl("^[0-9] $", x) ){
    strftime(as.Date( as.integer(x), origin="1899-12-30" )) }
  else{ strftime(as.POSIXlt(x, format="%d/%m/%Y")) } } ))
 

Результат:

 [1] "1970-04-20" "1995-02-28" "1988-11-27" "1964-03-07" "1999-06-02"
 

Ответ №2:

 dates <- c(25678, 34758, 32474, 23443, "02/06/1999")
dplyr::if_else(stringr::str_length(dates) == 5, 
        janitor::excel_numeric_to_date(as.numeric(dates)),  
        lubridate::dmy(dates))
[1] "1970-04-20" "1995-02-28" "1988-11-27" "1964-03-07" "1999-06-02"
 

Комментарии:

1. Когда я запускаю это, числа в исходном dates векторе немедленно преобразуются в символы, потому что вектор имеет смешанный тип. Так что тогда is.numeric это всегда ЛОЖЬ.

2. Правильно, извините, условием для проверки может быть строка длиной 5, например, через: stringr::str_length(даты) == 5

3. обновил его с исправлением

Ответ №3:

 library(janitor)
convert_to_date(dates, character_fun = lubridate::dmy)
#> [1] "1970-04-20" "1995-02-28" "1988-11-27" "1964-03-07" "1999-06-02"