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

如何统计指定日期区间内超阈值天数?R语言数据框处理方案

解决方法

问题分析

你原代码的核心问题是没有将每个测量周期的日期窗口与df2的日期做关联匹配,直接对整个df2的气温做判断,导致输出的是全局布尔值列表,而非每个周期的符合条件天数统计。

方法1:基于purrr+dplyr的逐行处理(适合中小数据量)

先确保所有日期字段为Date类型,再通过map2_int逐行计算每个周期内符合条件的天数:

library(dplyr)
library(purrr)
library(lubridate)

# 转换日期格式(如果原始数据不是Date类型)
df1 <- df1 %>% mutate(across(c(start_date, end_date), ymd))
df2 <- df2 %>% mutate(date = ymd(date))

# 生成目标结果表
result_df <- df1 %>%
  mutate(daysover25 = map2_int(start_date, end_date, ~ {
    # 筛选当前周期内气温≥25℃的记录并统计数量
    df2 %>%
      filter(date >= .x, date <= .y, maxtemp >= 25) %>%
      nrow()
  }))

方法2:基于fuzzy_join的高效关联(适合大数据量)

如果数据量较大,逐行处理效率偏低,可通过模糊连接实现批量匹配统计:

library(fuzzyjoin)
library(dplyr)
library(lubridate)

# 转换日期格式
df1 <- df1 %>% mutate(across(c(start_date, end_date), ymd))
df2 <- df2 %>% mutate(date = ymd(date))

# 模糊关联+分组统计
result_df <- df2 %>%
  filter(maxtemp >= 25) %>%
  # 匹配日期落在测量周期内的记录
  fuzzy_inner_join(df1, 
                   by = c("date" = "start_date", "date" = "end_date"),
                   match_fun = list(`>=`, `<=`)) %>%
  # 按测量周期分组统计天数
  group_by(uniqueID, start_date, end_date) %>%
  summarise(daysover25 = n(), .groups = "drop") %>%
  # 补全无符合条件天数的周期(将NA替换为0)
  right_join(df1, by = c("uniqueID", "start_date", "end_date")) %>%
  mutate(daysover25 = replace_na(daysover25, 0))

两种方法最终都会返回包含uniqueID、start_date、end_date和daysover25列的目标数据表。

内容的提问来源于stack exchange,提问作者Taylor Harman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:15:08