我有一个数据帧,其中日期由字符串"表示;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
得到数字,然后用ymd
和truncated
转换成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"