You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:03:34