在R语言中将财年日期转换为日历年日期的实现方法
财年日期转日历年的R实现
给定财年日期向量,按照「1-6月年份不变,7-12月年份减1」的规则转换为日历年日期,这里提供两种实现方式:
基础R实现
无需额外安装包,用原生字符串处理函数即可完成:
fydates <- c("apr_20","jun_20","jul_21","aug_21","dec_23","jan_23","dec_24","jan_24") # 拆分每个日期为月份和财年年份 split_dates <- strsplit(fydates, "_") months <- sapply(split_dates, "[", 1) fy_years <- as.integer(sapply(split_dates, "[", 2)) # 将月份缩写转为数字(用于判断月份区间) month_numbers <- match(tolower(months), tolower(month.abb)) # 根据规则调整年份:7-12月财年减1,其余保持不变 cal_years <- ifelse(month_numbers >= 7, fy_years - 1, fy_years) # 拼接回目标格式 realdates <- paste(months, cal_years, sep = "_") # 输出结果 realdates #> [1] "apr_20" "jun_20" "jul_20" "aug_20" "dec_22" "jan_23" "dec_23" "jan_24"
步骤说明
strsplit按下划线拆分每个日期字符串,得到月份和财年年份的列表;- 用
sapply提取列表中的月份和年份,年份转为整数方便计算; match结合month.abb(R内置的月份缩写向量)把月份字符串转为对应数字,tolower确保大小写兼容;ifelse判断月份区间,对7-12月的财年年份减1,得到日历年;paste将月份和调整后的年份重新拼接成目标格式。
tidyverse实现
如果习惯使用tidyverse工具链,可通过以下流程完成:
library(tidyverse) fydates <- c("apr_20","jun_20","jul_21","aug_21","dec_23","jan_23","dec_24","jan_24") realdates <- tibble(date = fydates) %>% # 拆分日期为月份和财年年份,自动转换年份为整数 separate(date, into = c("month", "fy_year"), sep = "_", convert = TRUE) %>% mutate( # 转换月份缩写为数字 month_num = match(tolower(month), tolower(month.abb)), # 按规则调整年份 cal_year = ifelse(month_num >= 7, fy_year - 1, fy_year) ) %>% # 合并月份和日历年为目标格式 unite("real_date", month, cal_year, sep = "_") %>% # 提取结果向量 pull(real_date) realdates #> [1] "apr_20" "jun_20" "jul_20" "aug_20" "dec_22" "jan_23" "dec_23" "jan_24"
步骤说明
- 先将向量转为tibble数据框,方便后续操作;
separate拆分日期列,convert=TRUE自动将年份转为整数类型;mutate新增月份数字列和调整后的日历年列;unite将月份和日历年合并为目标格式的字符串;pull提取最终的结果向量。
内容的提问来源于stack exchange,提问作者Gilrob
相关产品推荐
相关产品推荐

