提取复杂字符串中的日期

Extract dates in a complex string

我在提取文件名中的日期时遇到问题,在我的示例中有 file.name 对象:

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")

我需要在新对象中提取文件名中的特定日期:201905182021010720181018。但是为此 a 不能使用 substr 因为 a 具有不同长度的区域名称(AZAMBUJAI002ARINCAODOSSOARES051BVILAPALMA33K)并且也不能使用删除字母(原因数字区域 ID - 002、051 和 33)。以“_”分隔的“.tif”之前最后的日期不是有用的信息。

我想要的输出是:

mydates
[1] 2019-05-18
[2] 2021-01-07
[3] 2018-10-18

描述的问题有什么解决办法吗?谢谢!!

library(lubridate)

ymd(gsub("(^.*_)(20[0-9]{2}_)([0-9]{2}_)([0-9]{2}_)(.*$)", 
         "\2\3\4", 
         file.name))

ymd 是一个 lubridate 函数,它识别 YYYY-MM-DD 日期,几乎与使用的分隔符无关。

gsub 转换字符串。里面的正则表达式:

  • (^.*_) 是第一个捕获组。接受从开头到下划线的任何内容。
  • (20[0-9]{2}_) 是第二个捕获组。它采用以 20 开头,后跟任意两位数字和下划线的字符串。
  • ([0-9]{2}_) 是第三个和第四个捕获组。它需要两位数字后跟一个下划线。
  • (.*$) 是最后一个(第 5 个)捕获组。将任何内容带到字符串的末尾。
  • "" returns 第二个、第三个和第四个捕获组。

编辑:

对代码的解释仍然可以,但是要在名称之后检索日期,则需要的代码是这样的:

ymd(gsub("(^.*[A-Z])(20[0-9]{2})([0-9]{2})([0-9]{2})(.*$)",
         "\2\3\4", 
         file.name))

这是一种使用正则表达式提取的方法 - 假设您只有年份以 20xx

开头
library(stringr)
library(lubridate)

date_string <- str_extract(file.name,
  "20\d{2}\[0,1][1-9]\[0-3][1-9]")

date_string
#> [1] "20190518" "20210107" "20181018"

ymd(date_string)
#> [1] "2019-05-18" "2021-01-07" "2018-10-18"

reprex package (v2.0.0)

于 2021-05-19 创建

使用基本 R 函数的解决方案。只要格式始终为“yyyymmdd”并且相关字符串出现在第一个下划线之前即可工作:

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")

两次使用gsub:首先(在函数内部)去掉第一个下划线后的所有内容,然后提取八个数字的序列([0-9]{8}:

dates <- gsub(".*([0-9]{8}).*", "\1", gsub("^([^_]*)_.*", "\1", file.name))

最后使用 as.Date 将字符串转换为 R 日期对象(可以使用 format 重新转换为字符串):

dates_as_actual_date <- as.Date(dates, format("%Y%m%d"))
              

dates_as_actual_date 是一个 R 日期对象,看起来像这样:

[1] "2019-05-18" "2021-01-07" "2018-10-18"