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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:48:08