R语言使用lubridate解析带TH、ST后缀的英文日期问题
问题核心
你当前的解析逻辑会失败,主要源于两点:
- 原始日期字符串前后带有冗余空格,未做预处理
- 日期部分附带的
ST/TH/ND/RD这类序数后缀,是%d占位符无法直接识别的——%d仅匹配纯数字格式的日值,遇到附带字母的内容会匹配失败,返回NA值
解决方案
方法一:先清洗字符串再解析(容错性最高,最稳妥)
核心思路是先剔除冗余内容,再套用你原本的解析规则,完整可运行代码如下:
library(lubridate) # 原始测试数据 dt <- c(" 4TH AUGUST 2014 ", " 1ST AUGUST 2014 ") # 清洗步骤:1. 去除字符串前后的多余空格 2. 删除数字后附带的不区分大小写的序数后缀 dt_clean <- trimws(dt) |> gsub(pattern = "(\\d+)(st|nd|rd|th)", replacement = "\\1", ignore.case = TRUE) # 执行日期解析 parse_date_time(dt_clean, orders = "%d %B %Y")
方法二:直接在解析规则中兼容序数后缀
如果不想单独写预处理环节,也可以在parse_date_time的格式规则中直接加入对序数后缀的匹配,跳过独立清洗步骤:
parse_date_time(dt, orders = "%d(?i)(st|nd|rd|th) %B %Y")
注:该方法的容错性弱于先清洗再解析的方案,如果字符串中存在格式不规范的杂字,更容易出现解析偏差。
内容的提问来源于stack exchange,提问作者Laurence_jj
相关产品推荐
相关产品推荐

