Разобрать дату и время в одном столбце с помощью 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))
}

Кажется, это работает, т.е. я получаю столбец даты без каких-либо предупреждающих сообщений, но кажется немного неуклюжим. Я скучаю по пижону и более интуитивному способу сделать это?

0 ответов

Другие вопросы по тегам