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

如何在R中基于阈值与时间间隔过滤时间序列数据

R时间序列按阈值筛选日期解决方案

可以用dplyr结合lubridate包实现需求,步骤如下:

  1. 标记符合阈值的记录,划分连续符合条件的区间,提取第一个连续区间的最后日期;
  2. 筛选与第一个日期间隔至少两年的、符合阈值的记录,取对应日期。

完整代码

library(dplyr)
library(lubridate)

dat <- data.frame(time = as.Date(c("2001-12-31","2002-12-31","2003-12-31","2004-12-31", 
                                   "2005-12-31","2006-12-31","2007-12-31","2008-12-31")),
                  value = c(-52.1,-52.44,23.5,-64.2,10.7,-15.4,-52.4,231.7))

# 提取首次连续符合阈值区间的最后日期
first_interval_last <- dat %>%
  mutate(meet_threshold = value <= -50,
         # 生成连续符合条件的分组ID
         group_id = cumsum(c(TRUE, diff(meet_threshold) != 0))) %>%
  filter(meet_threshold) %>%
  group_by(group_id) %>%
  slice_tail(n = 1) %>%
  ungroup() %>%
  slice_head(n = 1) %>%
  pull(time)

# 筛选间隔至少两年的符合阈值日期
second_date <- dat %>%
  filter(value <= -50, time >= first_interval_last + years(2)) %>%
  slice_head(n = 1) %>%
  pull(time)

# 合并结果
result <- c(first_interval_last, second_date)
print(result)

输出结果

[1] "2002-12-31" "2007-12-31"

代码说明

  • meet_threshold列标记符合value ≤ -50的行;
  • group_id通过cumsum和diff划分连续符合条件的区间;
  • slice_tail提取每个连续区间的最后日期,slice_head锁定第一个区间的结果;
  • 第二步用time >= first_interval_last + years(2)确保间隔要求,再取首个符合条件的日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:07:23