R语言中是否有函数可解析包含不同格式日期的大体积字符向量?
解决方案
最优方案:使用lubridate::parse_date_time自动匹配多格式
该函数支持传入多个可能的日期格式,会自动为每个元素匹配对应格式完成解析,全程基于向量化运行速度极快,不会产生解析警告:
library(lubridate) fixed_result_date_time <- as_date( parse_date_time( result_date_time_vector, # 按实际可能的格式顺序传入 orders = c("Ymd HMS", "mdY"), tz = "America/New_York" ) )
可选方案:按格式索引分批次处理
如果希望手动控制格式匹配逻辑,避免自动匹配的不确定性,可以先筛选出不同格式的元素索引,再分别做解析,同样是向量化操作,速度远高于for循环,且不会产生警告:
library(lubridate) library(stringr) # 注意R字符串内正则的反斜杠需要双重转义 idx_ymd_hms <- str_detect(result_date_time_vector, "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$") fixed_result_date_time <- rep(as.Date(NA), length(result_date_time_vector)) # 仅处理符合ymd_hms格式的元素 fixed_result_date_time[idx_ymd_hms] <- as_date(ymd_hms(result_date_time_vector[idx_ymd_hms], tz = "America/New_York")) # 仅处理符合mdy格式的元素 fixed_result_date_time[!idx_ymd_hms] <- as_date(mdy(result_date_time_vector[!idx_ymd_hms], tz = "America/New_York"))
原代码问题说明
- for循环效率低的原因:R的显式for循环是上层解释执行,处理几十万条数据的效率远低于C语言实现的向量化操作
- ifelse出现警告的原因:ifelse的两个分支会先对全量向量执行计算再按条件选择结果,相当于
ymd_hms会尝试解析所有20963个m/d/y格式的元素、mdy会尝试解析所有447043个y-m-d H:M:S格式的元素,自然会产生大量解析失败警告
内容的提问来源于stack exchange,提问作者StevinWilson
相关产品推荐
相关产品推荐

