在R语言中提取带时间戳的每小时温度最大值/最小值/中位数
解决每小时温度统计量提取问题
针对你这种多地点每10分钟采集的温度数据,要提取小时级的最大值、最小值和中位数,我推荐用dplyr+lubridate的组合来处理,代码简洁直观,还能轻松处理缺失值。下面是具体步骤和代码:
1. 准备工作
首先确保你加载了必要的包,没安装的话先执行安装命令:
install.packages(c("dplyr", "lubridate")) library(dplyr) library(lubridate)
2. 核心处理代码
假设你的数据框名叫temp_data,我们先按小时分组,再批量计算每个LCZ列的统计量:
hourly_temp_stats <- temp_data %>% # 把时间戳向下取整到对应小时(比如17:10→17:00,作为小时分组的标识) mutate(hourly_timestamp = floor_date(Time, unit = "hour")) %>% # 按小时分组 group_by(hourly_timestamp) %>% # 对所有LCZ开头的列,计算max/min/median,忽略缺失值NA summarise( across( .cols = starts_with("LCZ"), .fns = list( max_temp = ~max(., na.rm = TRUE), min_temp = ~min(., na.rm = TRUE), median_temp = ~median(., na.rm = TRUE) ), # 自定义列名格式,比如LCZ 3-2_max_temp .names = "{col}_{fn}" ) ) %>% # 取消分组,方便后续操作 ungroup()
3. 结果说明
运行完后,hourly_temp_stats会包含:
hourly_timestamp:每个小时的起始时间戳(比如2017-08-26 17:00:00)- 类似
LCZ 3-2_max_temp、LCZ 3-2_min_temp这样的列,对应每个LCZ地点的小时级统计值
备选方案:用data.table处理(适合大数据)
如果你的数据量很大,data.table的运行效率会更高,代码如下:
install.packages("data.table") library(data.table) library(lubridate) # 转成data.table格式 setDT(temp_data) # 添加小时分组列 temp_data[, hourly_timestamp := floor_date(Time, unit = "hour")] # 计算统计量,同时处理全NA的情况 hourly_stats <- temp_data[, lapply(.SD, function(x) .( max_temp = ifelse(all(is.na(x)), NA, max(x, na.rm = TRUE)), min_temp = ifelse(all(is.na(x)), NA, min(x, na.rm = TRUE)), median_temp = ifelse(all(is.na(x)), NA, median(x, na.rm = TRUE)) )), by = hourly_timestamp, .SDcols = patterns("^LCZ")] # 把嵌套的统计量展开成宽表 hourly_stats <- melt(hourly_stats, id.vars = "hourly_timestamp") hourly_stats <- dcast(hourly_stats, hourly_timestamp + variable ~ value, value.var = "value")
小提示
- 如果你希望用小时的结束时间作为时间戳,把
floor_date换成ceiling_date即可 - 代码里的
ifelse(all(is.na(x)), NA, ...)是为了避免全NA的组返回-Inf或Inf,如果不需要这个逻辑可以直接去掉,用max(x, na.rm=TRUE)这类基础写法
内容的提问来源于stack exchange,提问作者user9586983
相关产品推荐
相关产品推荐

