使用Lubridate解析多格式日期时出现警告的问题排查
问题原因与解决方法
警告产生的原因
你用dplyr::if_else时,它是向量化执行逻辑:会先完整计算两个分支的表达式(也就是先对所有元素跑一遍mdy(value),再对所有元素跑一遍dmy(value)),之后才根据nchar(value) ==8的条件选择对应结果。
比如:
- 长度为10的日期(如
"17/11/2023")用mdy()解析时,会把17当成月份,这显然无效,触发解析失败警告; - 长度为8的日期(如
"02/25/24")用dmy()解析时,会把25当成月份,同样无效,触发另一个警告。
虽然最终if_else帮你选对了正确分支的结果,但计算分支时产生的警告还是会被保留下来。
解决方法
有两种简单的方式消除警告,同时保证解析结果正确:
方法1:用parse_date_time直接尝试多种格式(推荐)
lubridate的parse_date_time可以指定多种日期格式,它会自动对每个元素匹配第一个能解析成功的格式,不需要手动判断长度:
library(dplyr) library(lubridate) x <- c("01/11/24", "17/11/2023", "02/25/24", "01/03/2022") df <- as_tibble(x) new_df <- df %>% mutate(value = parse_date_time(value, orders = c("mdy", "dmy")))
方法2:逐行处理,避免计算无效分支
用rowwise()让代码逐行执行,每一行只计算符合条件的那个解析函数,不会触发无效解析:
new_df <- df %>% rowwise() %>% mutate(value = if(nchar(value) == 8) mdy(value) else dmy(value)) %>% ungroup()
两种方法得到的结果都和你原来的一致,且不会出现解析失败的警告。
内容的提问来源于stack exchange,提问作者AColoredReptile
相关产品推荐
相关产品推荐

