在 R 中"ABCYYYYMM"日期格式转换文本字符串



我有一个数据帧,其中日期由字符串"表示;ABC202003";其格式为";ABCYYYYMM";。如何删除";ABC";部分并将其转换为R中的年月日格式?

这行吗:

> library(dplyr)
> library(stringr)
> str <- c('ABC202003','DEF202004')
> df <- data.frame(str = str)
> df
str
1 ABC202003
2 DEF202004
> df %>% mutate(date = str_extract_all(str, '\d+')) %>% 
+   mutate(date = str_replace_all(date, '(\d{4})(\d{2})','\1-\2'))
str    date
1 ABC202003 2020-03
2 DEF202004 2020-04
> 

月-年格式:

> df %>% mutate(date = str_extract_all(str, '\d+')) %>% 
+   mutate(date = str_replace_all(date, '(\d{4})(\d{2})','\2-\1'))
str    date
1 ABC202003 03-2020
2 DEF202004 04-2020
> 

问题中的数据已更正。

x <- "ABC022003"

如果字符串的开头总是有3个字符,请首先运行以下命令:

date <- as.Date(paste0("01", substring(x, 4)), "%d%m%Y")

如果可能有不同数量的非数字,请运行以下命令:

date <- as.Date(paste0("01", gsub("[^[:digit:]]", "", x)), "%d%m%Y")

现在date是类"character"的对象。以下任意一项都将创建一个月-年字符串。

format(date, "%m-%Y")
#[1] "02-2003"
format(date, "%b-%Y")
#[1] "Feb-2003"
zoo::as.yearmon(date)
#[1] "Feb 2003"

我们可以用parse_number得到数字,然后用ymdtruncated转换成Date类。如果需要将格式更改为月-年,则使用format

library(dplyr)
library(lubridate)
df %>% 
mutate(date = format(ymd(readr::parse_number(str), truncated = 2), '%m-%Y'))
#        str    date
#1 ABC202003 03-2020
#2 DEF202004 04-2020

如果需要是Date类,请删除format

df %>% 
mutate(date = ymd(readr::parse_number(str), truncated = 2))
#        str       date
#1 ABC202003 2020-03-01
#2 DEF202004 2020-04-01

数据

df <- structure(list(str = c("ABC202003", "DEF202004")), 
class = "data.frame", row.names = c(NA, 
-2L))

首先使用gsub去掉开头的字母

x <- c('ABC202003','DEF202004')
x <- gsub("[^0-9.-]", "", x)

然后使用lubridate中的parse_date_time将其解析为日期

x <- lubridate::parse_date_time(x, orders = 'ym', truncated = 1)

然后最后使用format将它们格式化为您想要的

format(x, '%Y-%m')

这就是最终结果:

[1] "2020-03" "2020-04"

最新更新