使用lubridate和if_else()在同一列中解析日期和日期时间

时间:2017-05-06 02:46:29

标签: r date lubridate

我在数据框中有一个字符列,我想将其解析为日期。皱纹是它是日期和日期时间的混合物。最终目标是只有一列日期。

例如,

x = c("1995-01-01T00:00:00", "1/1/1985")
df = data_frame(d = x)

我想要尝试的第一件事是一个简单的if_elseymd_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 个答案:

没有答案