如何在R中基于日期区间创建fishing_year新列?
问题描述
- 需要基于
date列的日期区间生成新列fishing_year:- 日期在
2019-04-01至2020-03-31时,fishing_year为2019 - 以此类推,每个年度区间为当年4月1日至次年3月31日,对应年份为区间起始的年份
- 日期在
- 已将
date列转为日期对象,但编写的R脚本运行失败 - 另外,R中日期显示正常(如
2019-04-01),但导出至CSV后显示异常 - 失败的脚本如下:
fishing_year=gpr_df_R %>% mutate(fishing_year=case_when(date = ('2019-04-01' ~ '2020-03-31') ~"2019",('2020-04-01' ~ '2021-03-31')~"2020", ('2021-04-01' ~ '2022-03-31')~"2021",('2022-04-01' ~ '2023-03-31')~"2022",('2023-04-01' ~ '2024-03-31')~"2023"))
解决方案
1. 修复case_when语法错误
原脚本核心问题是日期区间判断的语法错误:case_when的条件需用逻辑表达式(>=/<=),而非=和~的错误写法,同时要确保区间日期字符串转为Date类型避免类型不匹配。
方法一:明确区间判断
# 确保date列为Date类型(若未转换) gpr_df_R$date <- as.Date(gpr_df_R$date) # 生成fishing_year列 gpr_df_R <- gpr_df_R %>% mutate(fishing_year = case_when( date >= as.Date("2019-04-01") & date <= as.Date("2020-03-31") ~ 2019, date >= as.Date("2020-04-01") & date <= as.Date("2021-03-31") ~ 2020, date >= as.Date("2021-04-01") & date <= as.Date("2022-03-31") ~ 2021, date >= as.Date("2022-04-01") & date <= as.Date("2023-03-31") ~ 2022, date >= as.Date("2023-04-01") & date <= as.Date("2024-03-31") ~ 2023, # 可选:处理不在上述区间的日期 TRUE ~ NA_integer_ ))
方法二:简洁计算(无需手动写所有区间)
根据规则,fishing_year可通过月份直接计算:若日期月份≥4,取当年年份;否则取前一年年份,这种方法更灵活:
# 先安装加载lubridate包(若未安装) # install.packages("lubridate") library(lubridate) gpr_df_R <- gpr_df_R %>% mutate( fishing_year = ifelse(month(date) >= 4, year(date), year(date) - 1) )
若不想用lubridate,可改用基础R实现:
gpr_df_R <- gpr_df_R %>% mutate( year = as.integer(format(date, "%Y")), month = as.integer(format(date, "%m")), fishing_year = ifelse(month >= 4, year, year - 1) ) %>% select(-year, -month) # 删除临时列
2. 解决CSV导出日期异常问题
R中Date类型导出CSV时可能被转为数值(自1970-01-01起的天数),可通过以下两种方法处理:
- 方法一:导出前将
date列转为固定格式的字符型:
gpr_df_R <- gpr_df_R %>% mutate(date = format(date, "%Y-%m-%d")) write.csv(gpr_df_R, "your_file.csv", row.names = FALSE)
- 方法二:使用
readr包的write_csv函数自动保留日期格式:
# install.packages("readr") library(readr) write_csv(gpr_df_R, "your_file.csv")
内容的提问来源于stack exchange,提问作者Angela Russell
相关产品推荐
相关产品推荐

