2016-05-03 5 views
2

У меня есть вектор дат в формате символов Мне нужно преобразовать в формат даты. Некоторые месяцы сокращены, а некоторые - нет, потому что этот список является результатом ломаной сети. По какой-то причине не удается следующий преобразовать «7 сентября» (работает для остальных):Преобразование списка дат из символа в формат даты

employ <- c("Jan 5", "Feb 2", "March 9", "April 6", "May 4", "June 1","July 6", "Aug 3", "Sept 7", "Oct 5", "Nov 2", "Dec 7","Jan 4") 
employ2 <- as.Date(employ, format = "%B %d") 

#This is what the output of employ2 looks like: 
[1] 2016-01-05 2016-02-02 2016-03-09 2016-04-06 2016-05-04 2016-06-01 
[7] 2016-07-06 2016-08-03 <NA>  2016-10-05 2016-11-02 2016-12-07 
[13] 2016-01-04 

Я думал, что проблема может быть «т» в сентябре, так что я взял его с помощью gsub. В этом случае код не может преобразовать «5 октября».

employ <- c("Jan 5", "Feb 2", "March 9", "April 6", "May 4", "June 1","July 6", "Aug 3", "Sept 7", "Oct 5", "Nov 2", "Dec 7","Jan 4") 
employ <- gsub("t", "", employ) 
employ2 <- as.Date(employ, format = "%B %d") 

Может ли кто-нибудь помочь преобразовать весь список успешно? Огромное спасибо.

РЕДАКТИРОВАТЬ: пожалуйста, не отвечайте, ясно, что проблема действительно есть «t». Просто заметила это. Нужно выяснить другой способ удаления «t» с сентября.

+0

'as.Date (работает с (респ ('% B% d', 8), '% Bt% d', rep ('% B% d', 4))) ' – alistaire

+0

Или лучше,' lubridate :: parse_date_time (use, c ('% B% d ','% Bt% d '), exact = TRUE) ' – alistaire

ответ

3

Как вы видели, ваше выражение gsub потерпело неудачу, поскольку оно удалило дополнительные символы «t» из других строк, например «Oct».

Вы можете легко изменить только нужную строку:

sub("Sept", "Sep", employ) 

sub используется вместо gsub, потому что вам нужно только одну замену за вектор входа.

3

Мы можем взять только первые 3 символа из нечисловом части, а затем применить as.Date

as.Date(sub("(.{3}).*(\\d+)", "\\1 \\2", employ), format = '%B %d') 
#[1] "2016-01-05" "2016-02-02" "2016-03-09" "2016-04-06" "2016-05-04" 
#[6] "2016-06-01" "2016-07-06" "2016-08-03" "2016-09-07" "2016-10-05" 
#[11] "2016-11-02" "2016-12-07" "2016-01-04" 

Нет необходимости каких-либо внешних упаковок и выше выходе Date класса.

+0

Хотя принятый ответ работает для этого примера, я считаю, что это лучший ответ, поскольку он будет обрабатывать ** большинство ** случаев (до тех пор, пока первые 3 символы - правильное написание). – SymbolixAU

+0

@Symbolix Согласен. Обратите внимание на вопросника, вы можете изменить назначение отметки по своему желанию в любое время и по любой причине. –

+0

@Gracos Все в порядке. Вы сохраняете принятый ответ с постулатом Мэтью Лундберга, когда он отвечал первым и работает для опубликованного примера. Во всяком случае, это еще один вариант. – akrun

2

В lubridate ПАКЕТЕ в parse_date_time может обрабатывать вектор возможных форматов, но нуждается в exact = TRUE наборе так интерпретирует дополнительные t как символ, а не знак:

library(lubridate) 
parse_date_time(employ, c('%B %d', '%Bt %d'), exact = TRUE) 
# [1] "2016-01-05 UTC" "2016-02-02 UTC" "2016-03-09 UTC" "2016-04-06 UTC" "2016-05-04 UTC" 
# [6] "2016-06-01 UTC" "2016-07-06 UTC" "2016-08-03 UTC" "2016-09-07 UTC" "2016-10-05 UTC" 
# [11] "2016-11-02 UTC" "2016-12-07 UTC" "2016-01-04 UTC" 
Смежные вопросы