readr
包有一个名为parse_number
的函数,它返回string
:中的数字
readr::parse_number("Hello 2022!")
[1] 2022
是否有类似的方法从string
返回日期?readr
有一个名为parse_date
的函数,但它的作用不同:
readr::parse_date("X2018-01-11_poland")
Warning: 1 parsing failure.
row col expected actual
1 -- date like X2018-01-11_poland
[1] NA
期望输出:
# the raw string is "X2018-01-11_poland"
2018-01-11
附言:我对正则表达式不感兴趣。
lubridate
包具有易于使用的parse_date_time2
。
library(lubridate)
dstring <- "X2018-01-11_poland"
date <- parse_date_time2(dstring, orders='Ymd')
date
#[1] "2018-01-11 UTC"
这里有一个没有正则表达式的想法,
parse_date(strsplit(x, '_', fixed = TRUE)[[1]][1], format = 'X%Y-%m-%d')
#[1] "2018-01-11"
然而,如果波兰部分也是固定的,你可以再做一次,
parse_date(x, format = 'X%Y-%m-%d_poland')
#[1] "2018-01-11"
1(这只使用基R,不使用任何正则表达式。它假设(1(日期之前只有字母和空格,就像问题中的情况一样,但如果有必要,可以通过在let中添加额外的字符来轻松放松;(2(日期是标准日期格式。charter将第一个变元中的第i个字符转换为第二个变元的第I个字符,用空格替换每个字母。然后使用as.Date。注意,as.Date会忽略末尾的垃圾邮件,所以如果在日期后面没有其他字符,也可以。
x <- "X2018-01-11_poland"
lets <- paste(letters, collapse = "")
as.Date(chartr(lets, strrep(" ", nchar(lets)), tolower(x)))
## [1] "2018-01-11"
2(如果我们知道字符串总是以X开头,并且Date正好出现在它之后,那么我们可以在as.Date格式字符串中指定前缀。它也不使用任何正则表达式,只使用基R.
as.Date(x, "X%Y-%m-%d")
## [1] "2018-01-11"
3(如果您愿意妥协并使用一个非常简单的正则表达式——这里\D匹配任何非数字,并且反斜杠必须在引号内加倍。gsub删除任何这样的字符。
as.Date(gsub("\D", "", x), "%Y%m%d")
## [1] "2018-01-11"
使用碱基R或stringr
和lubridate
的可能替代品
as.Date(substr("X2018-01-11_poland", 2, 11), format = "%Y-%m-%d")
#> [1] "2018-01-11"
library(stringr)
library(lubridate)
ymd(str_sub("X2018-01-11_poland", 2, 11))
#> [1] "2018-01-11"
创建于2021-12-22由reprex包(v2.0.1(