R语言:如何从含可变长度前缀的文件名中提取指定日期并格式化
解决方案:用正则精准提取目标日期
这种前缀长度可变的文件名提取问题,用正则表达式就能完美解决,不用纠结前缀的具体长度。我给你两种方案,一种用stringr包(语法更直观),一种用Base R(不需要额外装包),都能得到你想要的格式化日期。
步骤说明
你的目标日期有个明显特征:是文件名中第一个紧跟在非数字字符之后、且后面跟着字母T的8位数字,而末尾下划线分隔的日期没有这个特征,刚好可以用正则精准匹配。
方案1:使用stringr包(推荐,语法简洁)
先加载stringr包,然后用str_extract提取目标字符串,最后转成日期格式:
# 加载包(如果没安装先运行 install.packages("stringr")) library(stringr) # 你的原始文件名 file.name <- c("AZAMBUJAI002A20190518T133231_20190518T133919_T22JCM_2021_05_19_01_18_22.tif", "RINCAODOSSOARES051B20210107T133231_20190518T133919_T22JSM_2021_05_19_01_18_22", "VILAPALMA33K20181018T133231_20190518T133919_T23JCM_2020_05_19_01_18_22.tif") # 提取8位日期字符串 date_str <- str_extract(file.name, "(?<=\\D)\\d{8}(?=T)") # 转换为yyyy-mm-dd格式的日期对象 mydates <- as.Date(date_str, format = "%Y%m%d") # 查看结果 mydates
运行后输出:
[1] "2019-05-18" "2021-01-07" "2018-10-18"
方案2:使用Base R(无需额外安装包)
如果不想装包,用Base R的regmatches和regexpr也能实现:
# 原始文件名 file.name <- c("AZAMBUJAI002A20190518T133231_20190518T133919_T22JCM_2021_05_19_01_18_22.tif", "RINCAODOSSOARES051B20210107T133231_20190518T133919_T22JSM_2021_05_19_01_18_22", "VILAPALMA33K20181018T133231_20190518T133919_T23JCM_2020_05_19_01_18_22.tif") # 提取日期字符串(注意要加perl=TRUE启用正则断言) date_str <- regmatches(file.name, regexpr("(?<=\\D)\\d{8}(?=T)", file.name, perl = TRUE)) # 转换为日期格式 mydates <- as.Date(date_str, "%Y%m%d") # 查看结果 mydates
正则表达式解释
(?<=\\D)\\d{8}(?=T) 这个正则的作用:
(?<=\\D):反向预查,确保匹配的8位数字前面是一个非数字字符(比如前缀末尾的A、B、K),这样就排除了前缀里的短数字(比如002、33);\\d{8}:匹配连续的8位数字,正好是我们要的日期;(?=T):正向预查,确保8位数字后面紧跟字母T,这样就精准定位到目标日期,完全避开了末尾下划线分隔的无效日期。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

