#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"