获取时间序列中符合条件的降温Bout长度及所有相关事件
识别符合条件的降温Bout并计算时长
咱们先明确要捕捉的降温事件核心规则:
- 降温过程必须持续稳定无升温:整个降温阶段里,每个时间点的温度都不高于前一个时间点
- 总降幅必须超过1个温度单位:降温起始温度和阶段最低温度的差值大于1
- 降温结束后温度进入稳定状态:连续时间单位内的温度波动幅度不超过0.1
原始数据加载代码
首先加载你提供的时间序列数据:
Lines <- " time Temperature 1 38.3 2 38.5 3 38.9 4 38.6 5 38.2 6 38.0 7 37.6 8 37.2 9 37.4 10 37.6 11 37.8 12 38.1 13 38.3 14 38.4 15 38.3 16 38.3 17 38.5 18 38.9 19 38.6 20 38.2 21 38.0 22 38.1 23 38.4 24 38.6 25 38.6 26 38.2 27 38.5 28 38.3 29 38.4 30 38.3 31 38.0 32 38.1 33 38.4 34 38.6 35 38.6 36 38.2 37 38.0 38 37.7 39 37.4 40 38.0 41 38.1 42 38.1 " DF <- read.table(text = Lines, header = TRUE)
温度变化趋势
先直观看看温度随时间的波动情况:
实现代码与逻辑
接下来咱们用R一步步识别符合条件的降温Bout:
library(dplyr) # 1. 计算温度变化量,标记降温状态(温度不升则视为降温阶段) DF <- DF %>% mutate(temp_change = Temperature - lag(Temperature), is_cooling = ifelse(temp_change <= 0, 1, 0)) %>% replace_na(list(is_cooling = 0)) # 第一个时间点无前置数据,标记为非降温 # 2. 识别连续的降温片段,计算每个片段的核心指标 DF <- DF %>% mutate(cooling_segment = cumsum(is_cooling != lag(is_cooling, default = 0))) %>% group_by(cooling_segment) %>% mutate(is_cooling_segment = any(is_cooling == 1), segment_start_time = first(time), segment_min_temp = min(Temperature), segment_start_temp = first(Temperature), temp_drop = segment_start_temp - segment_min_temp) %>% ungroup() # 3. 筛选出总降幅超过1的有效降温片段 valid_segments <- DF %>% filter(is_cooling_segment & temp_drop > 1) %>% distinct(cooling_segment, segment_start_time, segment_start_temp, segment_min_temp, temp_drop) # 自定义函数:找到降温结束后首次进入稳定状态的时间点 find_stable_time <- function(end_cool_time, df) { post_cooling <- df %>% filter(time > end_cool_time) for(i in 2:nrow(post_cooling)) { if(abs(post_cooling$Temperature[i] - post_cooling$Temperature[i-1]) <= 0.1) { return(post_cooling$time[i]) } } return(NA) # 若未找到稳定点则返回NA } # 4. 计算每个有效降温Bout的时长 valid_segments <- valid_segments %>% rowwise() %>% mutate(segment_end_time = segment_start_time + nrow(filter(DF, cooling_segment == !!cooling_segment)) - 1, stable_end_time = find_stable_time(segment_end_time, DF), bout_duration = stable_end_time - segment_start_time) %>% ungroup() # 输出最终结果 print(valid_segments)
结果说明
运行代码后会得到所有符合要求的降温Bout详情:
segment_start_time:降温开始的时间点temp_drop:该片段的总温度降幅stable_end_time:温度恢复稳定的时间点bout_duration:降温Bout的总时长
内容的提问来源于stack exchange,提问作者user8333220
相关产品推荐
相关产品推荐

