如何将年度季度字符串转为日期?解决parse_date格式报错问题
解决季度代码转日期格式的问题
你遇到的unsupported format %q错误,是因为readr::parse_date()不支持%q格式符——%q是lubridate包专属的季度识别标记,无法直接用在parse_date函数中。以下是两种可行的解决方案:
方案1:用lubridate的yq()函数(最简便)
yq()可以直接识别YYYYQN格式的字符串(比如"1991Q1"),只需把原列的数值转换成该格式即可:
library(dplyr) library(lubridate) pib %>% mutate( # 拆分年份和季度,拼接成yq支持的格式 date = yq(paste0(substr(as.character(`Trimestre (Código)`), 1, 4), "Q", substr(as.character(`Trimestre (Código)`), 5, 6))) ) %>% select(`Trimestre (Código)`, "Setores e subsetores", Valor, date) %>% pivot_wider(names_from = "Setores e subsetores", values_from = Valor)
如果原列是数值型,也可以用数学运算拆分,避免字符串操作:
pib %>% mutate( year = `Trimestre (Código)` %/% 100, # 提取前4位年份 quarter = `Trimestre (Código)` %% 100, # 提取后2位季度 date = yq(paste0(year, "Q", quarter)) ) %>% select(-year, -quarter) %>% # 删除临时中间列 select(`Trimestre (Código)`, "Setores e subsetores", Valor, date) %>% pivot_wider(names_from = "Setores e subsetores", values_from = Valor)
方案2:手动构造日期(无需lubridate)
如果不想额外加载lubridate,可以手动计算每个季度对应的起始月份(Q1=1月,Q2=4月,Q3=7月,Q4=10月),再拼接成标准日期格式:
library(dplyr) library(readr) pib %>% mutate( year = substr(as.character(`Trimestre (Código)`), 1, 4), quarter = as.integer(substr(as.character(`Trimestre (Código)`), 5, 6)), month = quarter * 3 - 2, # 计算季度对应的第一个月 date = parse_date(paste(year, month, "01", sep = "-")) # 转成日期 ) %>% select(-year, -quarter, -month) %>% select(`Trimestre (Código)`, "Setores e subsetores", Valor, date) %>% pivot_wider(names_from = "Setores e subsetores", values_from = Valor)
内容的提问来源于stack exchange,提问作者vini.m.oliveira
相关产品推荐
相关产品推荐

