Разобрать дату и время в одном столбце с помощью lubridate и if_else()
У меня есть символьный столбец в кадре данных, который я хочу проанализировать как даты. Морщина в том, что это смесь дат и времени. Конечная цель - иметь только столбец дат.
Например,
x = c("1995-01-01T00:00:00", "1/1/1985")
df = data_frame(d = x)
Первое, что я подумал попробовать, было простое if_else
: parse with ymd_hms()
если это дата-время, если не разбирать с mdy()
library(tidyverse)
library(stringr)
datefun = function(x){
is_datetime = str_length(x) == 19
if_else(is_datetime, lubridate::date(lubridate::ymd_hms(x)),
lubridate::mdy(x))
}
df %>% mutate(parsed = datefun(d))
Он работает в том смысле, что он возвращает желаемый столбец даты класса, но lubridate также выдает следующие предупреждения:
Warning messages:
1: 1 failed to parse.
2: 1 failed to parse.
Похоже, что появляются предупреждающие сообщения о том, что функции lubridate все еще пытаются проанализировать весь вектор смешанных дат и дат-времен. Решение, которое я придумал, состояло в том, чтобы изменить datefun
чтобы ymd_hms
анализирует вектор только даты и времени mdy
разбирает вектор только dates
,
datefun = function(x){
is_datetime = str_length(x) == 19
x_datetime = if_else(is_datetime, x, NA_character_)
x_date = if_else(!is_datetime, x, NA_character_)
if_else(is_datetime, lubridate::date(lubridate::ymd_hms(x_datetime)),
lubridate::mdy(x_date))
}
Кажется, это работает, т.е. я получаю столбец даты без каких-либо предупреждающих сообщений, но кажется немного неуклюжим. Я скучаю по пижону и более интуитивному способу сделать это?