#r #lubridate
Вопрос:
Мне нужно преобразовать строку дат в нескольких форматах в действительные даты.
например
dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001", "20161101")
> as.Date(dates, format=c("%m-%d-%Y","%Y%m%d"))
[1] "2017-01-01" NA "2016-12-01" "2016-09-01" NA "2016-11-01"
две даты отображаются как NA
Ответ №1:
В значительной степени я написал пакет anytime для:
R> dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001",
"20161101")
R> library(anytime)
R> anydate(dates)
[1] "2017-01-01" "2017-02-01" "2016-12-01" "2016-09-01"
[5] "2016-10-01" "2016-11-01"
R>
Анализируйте любые разумные входные данные надежно и без явного формата, источника или другого линейного шума.
При этом, не начиная стиль ISO с года, возникают потенциальные проблемы, поэтому 02-03-2017
это может быть 3 февраля или 2 марта. Я следую североамериканскому соглашению, которое я тоже считаю несколько нарушенным, но оно настолько распространено. Сделайте себе одолжение и попытайтесь ограничить вводимые данные датами ISO, по крайней мере, порядком ISO ГГГГММДД.
Комментарии:
1. Чтобы уточнить,
anydate()
имеет ли приоритет mdy над dmy?2. Да. Смотрите форматы , которые вы также можете перечислить изнутри.
3. Я обнаружил, что это немного быстрее
as.Date(ifelse(grepl("-", dates), as.Date(dates, format = c("%m-%d-%Y")), as.Date(dates, format = c("%Y%m%d"))), origin = "1970-01-01")
4. Есть ли какой-нибудь способ просто изменить источник? Я нахожу эту функцию действительно полезной, но мне нужно изменить начало координат при работе с целым числом на «1899-12-30» из-за Excel.
5. Привет @Croote, я думаю , можно было бы. Мы используем его как константу времени компиляции, и мы могли бы, я полагаю, изменить его. С совершенно новым уровнем тестирования, поэтому есть «стоимость». Может быть проще написать локальный
fromExcel()
помощник. Если вы хотите продолжить, откройте запрос на выпуск с некоторыми образцами данных/
Ответ №2:
Я пробовал библиотеку (в любое время), однако для больших данных это не сработало. Затем я нашел полезной эту последовательность:
df$Date2 <- format(as.Date(df$Date, format="%m/%d/%Y"), "%d/%m/%y")
df$Date2 <- as.Date(df$Date2,"%d/%m/%y")
Для меня это сработало с «8/10/2005», а также «08/13/05» в том же столбце.