R语言中如何按水文年分别计算多站点逐日气温的年平均值
现有数据集基础
你手头的逐日气温时间序列存储结构如下:
初始R语言数据框定义代码:
df <- data.frame( Date = c("01/01/1950", "01/02/1950", "12/31/1975"), MeanTempStn1 = c(13, 4.6, 9.8), MeanTempStn2 = c(9.5, 3.8, 8.2), MeanTempStn3 = c(10.8, 6.7, 5.5) )
对应结构化字段内容:
| Date | MeanTempStn1 | MeanTempStn2 | MeanTempStn3 |
|---|---|---|---|
| 01/01/1950 | 13.0 | 9.5 | 10.8 |
| 01/02/1950 | 4.6 | 3.8 | 6.7 |
| ... | |||
| 12/31/1975 | 9.8 | 8.2 | 5.5 |
核心需求
你已经掌握通过hydroSTM包计算站点日历年平均气温的方法,本次需要调整统计规则:按照水文年划分标准(每个水文年从当年9月1日起始,到次年8月31日结束,例如1976水文年的覆盖周期为1975年9月1日至1976年8月31日),逐站点计算对应水文年的年平均气温。
R语言实现步骤
- 转换日期格式
原始Date列是字符串形式的月/日/年格式,需要先转为R可识别的日期类型,才能提取年月字段做后续划分:# %m对应两位月份、%d对应两位日期、%Y对应四位年份 df$Date <- as.Date(df$Date, format = "%m/%d/%Y") - 标记每条数据对应的水文年
按照水文年规则给每一条逐日气温记录分配对应水文年标签:日期落在每年9-12月的,归属的水文年为日期年份+1;日期落在每年1-8月的,归属的水文年为日期本身的年份。
用时间处理包lubridate完成字段提取和标签匹配:library(lubridate) # 匹配水文年标签 df$hydrological_year <- ifelse( month(df$Date) >= 9, year(df$Date) + 1, year(df$Date) ) - 分组计算各站点水文年平均气温
按照水文年标签分组,逐站点计算组内所有有效气温值的平均值即可,不需要额外调用hydroSTM的日历年计算逻辑:library(dplyr) hydrological_year_mean <- df %>% group_by(hydrological_year) %>% # na.rm = T表示计算时自动忽略缺失的气温值 summarise( MeanTempStn1 = mean(MeanTempStn1, na.rm = T), MeanTempStn2 = mean(MeanTempStn2, na.rm = T), MeanTempStn3 = mean(MeanTempStn3, na.rm = T) )
注意:计算前可以提前检查数据集的日期连续性,若存在缺测日期,建议先补全完整的逐日时间范围再做分组统计,避免缺测导致平均值代表性不足。
内容的提问来源于stack exchange,提问作者Mohammad Hasan
相关产品推荐
相关产品推荐

