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

R语言按年份计算固定日期间隔的平均最低气温

运行环境
  • RStudio Version 1.4.1717
  • 硬件:搭载Intel芯片的Macintosh
  • 操作系统:Mac OS X 12_4_0
需求概述

现有存储多年4月逐日观测记录的气候数据集,单条记录对应一个观测日期的最低气温值,需要按年份分组,统计每年4月1日至4月5日固定5天区间内的最低气温平均值,最终输出类似2005年平均最低温3℃、2006年平均最低温5℃的按年统计结果。

原有自定义函数myfunc存在三类问题导致结果异常:日期筛选逻辑错误、列名引用不规范、返回值对象未定义。以下提供可直接复用的实现方案,支持针对多年气候数据批量计算任意固定日期间隔的气温均值,所有代码兼容R原生数据类型(POSIXct/POSIXt/data.frame等)。

实现步骤

1. 构造示例测试数据集

先构造和实际业务结构一致的测试数据,方便验证逻辑:

# 固定随机种子保证结果可复现
set.seed(123)
# 生成2001-2023年4月逐日日期序列,POSIXct格式
date_seq <- seq(as.POSIXct("2001-04-01"), as.POSIXct("2023-04-30"), by = "day")
# 组装气候数据框
clim_df <- data.frame(
  obs_time = date_seq,
  t_min = round(runif(length(date_seq), min = -2, max = 15), 1)
)

2. 通用计算函数

函数修复了原有自定义函数的所有已知问题,支持自定义统计区间,适配常规气候数据的缺失值场景:

calc_fixed_period_tmean <- function(df, date_col = "obs_time", t_col = "t_min",
                                    month_start = 4, day_start = 1,
                                    month_end = 4, day_end = 5) {
  # 输入格式校验
  if (!inherits(df[[date_col]], c("POSIXct", "POSIXt"))) {
    stop("日期列必须为POSIXct/POSIXt格式,请先转换日期格式后再运行")
  }
  if (!is.numeric(df[[t_col]])) {
    stop("气温列必须为数值型,请检查数据类型")
  }

  # 从日期字段拆分年、月、日数值,避免字符串匹配日期的逻辑漏洞
  df$cal_year <- as.integer(format(df[[date_col]], "%Y"))
  df$cal_month <- as.integer(format(df[[date_col]], "%m"))
  df$cal_mday <- as.integer(format(df[[date_col]], "%d"))

  # 按月、日数值筛选目标区间记录
  target_subset <- df[
    (df$cal_month == month_start & df$cal_mday >= day_start) |
      (df$cal_month == month_end & df$cal_mday <= day_end),
  ]

  # 按年分组计算均值,自动跳过缺失值
  annual_stat <- aggregate(
    x = target_subset[[t_col]],
    by = list(year = target_subset$cal_year),
    FUN = mean,
    na.rm = TRUE
  )
  # 重命名列,规范输出结构
  names(annual_stat)[2] <- "t_min_avg"
  annual_stat$t_min_avg <- round(annual_stat$t_min_avg, 1)

  # 明确返回统计结果对象
  return(annual_stat)
}

3. 运行计算并格式化输出

# 调用函数计算每年4月1日-5日的平均最低温
annual_result <- calc_fixed_period_tmean(clim_df)

# 拼接为要求的文本格式输出
final_output <- paste0(
  annual_result$year, "年平均最低温", annual_result$t_min_avg, "℃",
  collapse = "、"
)
# 打印结果
cat(final_output)

示例运行输出:
2001年平均最低温7.4℃、2002年平均最低温6.6℃、2003年平均最低温5.5℃、2004年平均最低温6.9℃、2005年平均最低温6.8℃、2006年平均最低温6.3℃、2007年平均最低温6.9℃、2008年平均最低温5.7℃、2009年平均最低温8.1℃、2010年平均最低温7.8℃、2011年平均最低温5.1℃、2012年平均最低温7.6℃、2013年平均最低温7.2℃、2014年平均最低温7.1℃、2015年平均最低温6.6℃、2016年平均最低温6.7℃、2017年平均最低温7.1℃、2018年平均最低温5.6℃、2019年平均最低温9.1℃、2020年平均最低温5.2℃、2021年平均最低温8.2℃、2022年平均最低温6.6℃、2023年平均最低温6.2℃

原有函数问题修复说明
  • 日期筛选逻辑:放弃原函数直接匹配日期字符串的写法,通过拆分年、月、日数值做区间判断,不会因为时区差异、日期字符串格式变体出现筛选遗漏或错选
  • 列名引用:采用df[[列名]]的标准数据框索引方式,避免模糊匹配、attach导致的列名索引错误
  • 返回值:函数末尾明确返回结构化的统计结果数据框,解决原函数运行后无明确输出的问题
  • 扩展性:支持自定义统计区间的起止月、日参数,不止可计算4月1-5日的均值,任意固定公历日期区间的年度统计都可直接传参实现

内容的提问来源于stack exchange,提问作者Christophe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:45:37