R формат фрейма данных даты, когда некоторые из них предшествуют 1/1/1900

#r #date

Вопрос:

Я импортирую CSV-файл со столбцом дат, и некоторые из дат предшествуют 1/1/1900. Я пытаюсь создать столбец в своем фрейме данных с датами в формате %m-%d-%Y, но мои усилия возвращают пустые ячейки. Ниже приведен пример. Спасибо за любую помощь.

 id <- c(1,2,3)
dates <- c(44321, 1, "December 25, 1890")
df <- data.frame(id, dates)
View(df)
 

введите описание изображения здесь

 df$dates2 <- as.Date(df$dates, format = "%m-%d-%y")
View(df)
 

введите описание изображения здесь

Желаемый Результат:

введите описание изображения здесь

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

1. итак, некоторые входные данные-это число от 1900 года, а другие-полная дата, записанная, как в вашем примере?

2. Если бы было согласованное происхождение, то оба as.Date("2021-05-05") - 44321 и as.Date("1900-01-01") - 1 были бы равны, но они разные, поэтому, похоже, в вопросе есть ошибка.

3. Дата 44321 в длинной форме была получена из Excel; см. Комментарий Лайми ниже по этому вопросу

Ответ №1:

Смешение форматов, которые у вас есть, делает ситуацию немного неловкой, но …

 library(lubridate)

as_date(
  ifelse(
    is.na(as.numeric(dates)), 
    mdy(dates), 
    dmy("01-Jan-1900")   days(as.numeric(dates)-1)
  )
)
[1] "2021-05-06" "1900-01-01" "1890-12-25"
 

что кажется разумным.

Вы уверены в преобразовании 44321 ? [Ни 1900, ни 2000 не были високосными годами…]

as.numeric() Вызовы необходимы, потому dates что принудительно вводятся в символ из-за последней записи в векторе.

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

1. Спасибо, что я раньше не использовал любридат, я попробую его прямо сейчас. Я думаю, что 44321 = 5/5/2021, по крайней мере, из Excel, так что здесь может быть проблема с этим решением?

2. Никогда не полагайтесь на Excel! Из этого следует: «Microsoft Excel с самых ранних версий ошибочно считал 1900 год високосным годом», что объясняет несоответствие.