求助:在R语言中计算跨日期夜间气象变量平均值
计算跨日期夜间时段的气象数据平均值
我有某区域机场的逐小时气象数据,包含date_time、temp_c、cloud_cover字段,示例数据如下:
| date_time | temp_c | cloud_cover |
|---|---|---|
| 2022-08-13 10:53:00 | 14.45 | 75 |
| 2022-08-13 11:53:00 | 14.42 | 50 |
| 2022-08-14 00:53:00 | 14.39 | 50 |
| 2022-08-14 01:53:00 | 14.35 | 50 |
需要仅计算UTC时间19:00:00至次日07:00:00夜间时段的气象变量平均值,且夜间时段跨越两天,最终输出按date分组的avg_temp、avg_cloud(非滑动平均),期望格式如下:
| date | avg_temp | avg_cloud |
|---|---|---|
| 2022-08-13 | 14.40 | 56.25 |
| 2022-08-14 | 15.00 | 55.38 |
尝试用subset()和aggregate()函数但未成功,寻求解决方法。
解决方案
核心思路是:将00:00-07:00的数据归属到前一天的分组,19:00-23:59的数据归属到当天分组,这样就能把跨天的夜间数据统一到对应日期组内计算平均值。
方法1:使用tidyverse(dplyr)
library(tidyverse) # 构造示例数据(替换为你的实际数据) weather_data <- tibble( date_time = as.POSIXct(c("2022-08-13 19:00:00", "2022-08-13 20:00:00", "2022-08-14 00:53:00", "2022-08-14 01:53:00", "2022-08-14 06:59:00", "2022-08-14 19:00:00")), temp_c = c(14.45, 14.42, 14.39, 14.35, 14.38, 15.00), cloud_cover = c(75, 50, 50, 50, 65, 55) ) # 处理并计算夜间平均值 nightly_avg <- weather_data %>% mutate( hour = hour(date_time), # 确定分组日期:19点及以后归当天,7点以前归前一天 group_date = case_when( hour >= 19 ~ as.Date(date_time), hour < 7 ~ as.Date(date_time) - days(1), TRUE ~ NA_Date_ # 标记非夜间时段,后续过滤 ) ) %>% filter(!is.na(group_date)) %>% # 只保留夜间数据 group_by(group_date) %>% summarise( avg_temp = round(mean(temp_c), 2), avg_cloud = round(mean(cloud_cover), 2) ) %>% rename(date = group_date) # 重命名为期望的列名 print(nightly_avg)
方法2:使用Base R
如果你习惯用基础R函数,以下是对应实现:
# 构造示例数据(替换为你的实际数据) weather_data <- data.frame( date_time = as.POSIXct(c("2022-08-13 19:00:00", "2022-08-13 20:00:00", "2022-08-14 00:53:00", "2022-08-14 01:53:00", "2022-08-14 06:59:00", "2022-08-14 19:00:00")), temp_c = c(14.45, 14.42, 14.39, 14.35, 14.38, 15.00), cloud_cover = c(75, 50, 50, 50, 65, 55) ) # 提取小时数 weather_data$hour <- as.integer(format(weather_data$date_time, "%H")) # 创建分组日期:0-7点的数据归属前一天 weather_data$group_date <- as.Date(weather_data$date_time) weather_data$group_date[weather_data$hour < 7] <- weather_data$group_date[weather_data$hour < 7] - 1 # 筛选夜间时段数据(19点及以后 或 7点以前) night_data <- subset(weather_data, hour >= 19 | hour < 7) # 聚合计算平均值,保留两位小数 nightly_avg <- aggregate( cbind(temp_c, cloud_cover) ~ group_date, data = night_data, FUN = function(x) round(mean(x), 2) ) # 重命名列名以匹配期望格式 colnames(nightly_avg) <- c("date", "avg_temp", "avg_cloud") print(nightly_avg)
内容的提问来源于stack exchange,提问作者Evan G
相关产品推荐
相关产品推荐

