我在数据框中有一个字符列,我想将其解析为日期。皱纹是它是日期和日期时间的混合物。最终目标是只有一列日期。
例如,
x = c("1995-01-01T00:00:00", "1/1/1985")
df = data_frame(d = x)
我想要尝试的第一件事是一个简单的if_else
: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))
}
这似乎有效,即我得到的日期列没有任何警告信息,但似乎有点笨重。我错过了一个更流畅,更直观的方法吗?