You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:37:39