如何在R中正确转换季度日期格式以绘制时间序列?
解决季度字符串转日期格式的问题
问题出在哪?
as.yearqtr年份全变2020:要么是你写的format参数和Quarter列的实际格式不匹配,要么是两位数年份被默认解析成了20xx(比如00-59默认对应2000-2059)。- lubridate报错:用错函数了,
quarter()是给日期提取季度的,不能直接喂季度字符串。 - 重复日期不背锅:格式转换是逐行处理的,同一季度对应多个国家的重复值不会导致转换失败。
具体修正方案
方案1:修正zoo包的as.yearqtr用法
先确认你的Quarter列格式:
- 如果是
Q1-23(季度-两位年份):
library(zoo) # 把60及以上的两位数年份归为19xx,60以下归为20xx,按需调整cutoff值 df1_long$Q1 <- as.Date(as.yearqtr(df1_long$Quarter, format = "Q%q-%y"), cutoff = 60)
- 如果是
Q1-2023(季度-四位年份),改一下format参数:
df1_long$Q1 <- as.Date(as.yearqtr(df1_long$Quarter, format = "Q%q-%Y"))
小提示:
%Y对应四位年份,%y对应两位年份;cutoff用来指定两位数年份的分界,比如设60的话,60-99会解析成1960-1999,00-59解析成2000-2059。
方案2:用lubridate包正确解析
用yq()函数直接解析季度字符串,支持多种格式:
library(lubridate) # 针对Q1-23格式,先转成yq能识别的23Q1格式 df1_long$Q1 <- yq(sub("Q(\\d)-(\\d{2})", "\\2-Q\\1", df1_long$Quarter)) # 针对Q1-2023格式,转成2023Q1格式 df1_long$Q1 <- yq(sub("Q(\\d)-(\\d{4})", "\\2-Q\\1", df1_long$Quarter))
或者用更灵活的parse_date_time():
df1_long$Q1 <- parse_date_time(df1_long$Quarter, orders = "Qq-Y")
方案3:手动拼日期(兜底方案)
如果上面的方法都不管用,直接提取季度和年份自己拼:
library(dplyr) df1_long <- df1_long %>% mutate( # 提取季度数字 qtr_num = as.integer(substr(Quarter, 2, 2)), # 提取年份(两位) year_two = as.integer(substr(Quarter, 4, 5)), # 转成四位年份,按需调整判断条件 year_full = ifelse(year_two >= 60, 1900 + year_two, 2000 + year_two), # 生成该季度第一天的日期 Q1 = as.Date(paste(year_full, qtr_num * 3 - 2, 1, sep = "-")) )
验证结果
转完之后用str(df1_long$Q1)检查是不是Date类型,用head(df1_long)看看日期和原季度对应得上不。
内容的提问来源于stack exchange,提问作者Rufus
相关产品推荐
相关产品推荐

