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

求助:在R语言中计算跨日期夜间气象变量平均值

计算跨日期夜间时段的气象数据平均值

我有某区域机场的逐小时气象数据,包含date_time、temp_c、cloud_cover字段,示例数据如下:

date_timetemp_ccloud_cover
2022-08-13 10:53:0014.4575
2022-08-13 11:53:0014.4250
2022-08-14 00:53:0014.3950
2022-08-14 01:53:0014.3550

需要仅计算UTC时间19:00:00至次日07:00:00夜间时段的气象变量平均值,且夜间时段跨越两天,最终输出按date分组的avg_temp、avg_cloud(非滑动平均),期望格式如下:

dateavg_tempavg_cloud
2022-08-1314.4056.25
2022-08-1415.0055.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:05:15