Разбор дат в нескольких форматах в R с помощью lubridate

У меня есть данные с датами в формате ММ / ДД / ГГ ЧЧ: ММ и другие в обычном старом формате ММ / ДД / ГГ. Я хочу разобрать их все в том же формате, что и «2010-12-01 12:12 EST». Как мне это сделать? Я попробовал следующий оператор ifelse, и он дал мне кучу длинных целых чисел и сообщил, что большое количество моих точек данных не удалось проанализировать:

df_prime$date <- ifelse(!is.na(mdy_hm(df$date)), mdy_hm(df$date), mdy(df$date))

df_prime - это дубликат фрейма данных df, который я изначально загрузил в

  IEN          date admission_number KEY_PTF_45       admission_from                        discharge_to
1  12  3/3/07 18:05                1     252186         OTHER DIRECT                                
2  12  3/9/07 12:10                1     252186                      RETURN TO COMMUNITY-    INDEPENDENT
3  12 3/10/07 15:08                2     252382 OUTPATIENT TREATMENT                                
4  12 3/14/07 10:26                2     252382                      RETURN TO COMMUNITY-INDEPENDENT
5  12 4/24/07 19:45                3     254343         OTHER DIRECT                                
6  12 4/28/07 11:45                3     254343                      RETURN TO COMMUNITY-INDEPENDENT
...
1046334 23613488506       2/25/14               NA         NA                            
1046335 23613488506 2/25/14 11:27               NA         NA                            
1046336 23613488506       2/28/14               NA         NA                            
1046337 23613488506        3/4/14               NA         NA                            
1046338 23613488506 3/10/14 11:30               NA         NA                            
1046339 23613488506 3/10/14 12:32               NA         NA        

Извините, если какое-то форматирование неверно, но столбец даты является наиболее важным.

ИЗМЕНИТЬ: Ниже приведен код для части моего фрейма данных с помощью команды dput:

structure(list(IEN = c(23613488506, 23613488506, 23613488506, 23613488506, 23613488506, 23613488506), date = c("2/25/14", "2/25/14 11:27", "2/28/14", "3/4/14", "3/10/14 11:30", "3/10/14 12:32")), .Names = c("IEN", "date"), row.names = 1046334:1046339, class = "data.frame") 

person Brandon Sherman    schedule 12.08.2014    source источник
comment
Значит, ваш столбец даты имеет символ и содержит форматы, отличные от тех, которые вы указали в своем отрывке? Есть ли шанс создать что-то с примерами всех форматов и в формате dput?   -  person Spacedman    schedule 12.08.2014
comment
Что такое формат dput? И я обновлю свой исходный пост примером второго формата. Прости за это!   -  person Brandon Sherman    schedule 12.08.2014
comment
<lazy> Сделайте ваш вопрос воспроизводимым. Подойдут два вектора со всеми возможными стилями. Желательно легко копировать в R. </lazy>   -  person Roman Luštrik    schedule 12.08.2014
comment
Создайте небольшой фрейм данных, возможно, всего с двумя столбцами (нас не волнует большая часть других вещей), а затем, где d - ваш фрейм данных, сделайте dput(d) - вставьте его, а затем мы можем просто вырезать и вставить его в наши сеансы чтобы точно восстановить ваш фрейм данных.   -  person Spacedman    schedule 12.08.2014
comment
@Spacedman Пожалуйста, посмотрите мой исходный пост. Спасибо еще раз!   -  person Brandon Sherman    schedule 12.08.2014


Ответы (2)


mdy_hm пакета lubridate имеет параметр truncated, который позволяет указывать даты, которые могут содержать не все биты. Для вашего примера:

> mdy_hm(d$date,truncated=2)
[1] "2014-02-25 00:00:00 UTC" "2014-02-25 11:27:00 UTC"
[3] "2014-02-28 00:00:00 UTC" "2014-03-04 00:00:00 UTC"
[5] "2014-03-10 11:30:00 UTC" "2014-03-10 12:32:00 UTC"
person Spacedman    schedule 12.08.2014
comment
Я думаю, это сработало. Спасибо! Я пробовал это раньше, и это не сработало, и я подозреваю, что это потому, что я поставил truncate в качестве параметра вместо truncated.. Есть ли способ сохранить время для тех, у кого это есть? - person Brandon Sherman; 12.08.2014
comment
Он сохраняет время для тех, у кого оно есть ... Он просто устанавливает время для тех, у кого его нет, на 00:00:00. - person Spacedman; 12.08.2014
comment
И да, вам нужно указать truncated, потому что функция сначала имеет аргумент ..., который улавливает все, что не соответствует точному аргументу. Если функция не имеет точек (или точки являются последними), вы можете сокращать аргументы. Таков Р. - person Spacedman; 12.08.2014

Вы пробовали использовать функцию guess_formats () в пакете lubridate? Воспроизводимый пример построения фрейма данных, подобного вашему, может оказаться полезным!

person Fabio    schedule 12.08.2014