【问题标题】:Calculation of the maximum duration over threshold in R (timeseries)计算 R(时间序列)中超过阈值的最大持续时间
【发布时间】:2019-07-04 19:09:51
【问题描述】:

我有一个 5 分钟分辨率的 xts-timeseries 温度数据。

head(dataset)
Time                Temp
2016-04-26 10:00:00 6.877
2016-04-26 10:05:00 6.877
2016-04-26 10:10:00 6.978
2016-04-26 10:15:00 6.978
2016-04-26 10:20:00 6.978
  1. 我想计算温度超过某个阈值的最长持续时间。 (假设是 20 °C)
  2. 我想计算温度超过某个阈值的所有持续时间。
  3. 我从我的 xts-data 创建一个 data.frame:

    df=data.frame(Time=index(dataset),coredata(dataset))
    head(df)
    Time                  Temp
    1 2016-04-26 10:00:00 6.877
    2 2016-04-26 10:05:00 6.877
    3 2016-04-26 10:10:00 6.978
    4 2016-04-26 10:15:00 6.978
    5 2016-04-26 10:20:00 6.978
    6 2016-04-26 10:25:00 7.079
    
  4. 然后我创建一个仅包含超过阈值的数据的子集:

    sub=(subset(x=df,subset = df$Temp>20))
    head(sub)
                Time         Temp
    7514 2016-05-22 12:05:00 20.043
    7515 2016-05-22 12:10:00 20.234
    7516 2016-05-22 12:15:00 20.329
    7517 2016-05-22 12:20:00 20.424
    7518 2016-05-22 12:25:00 20.615
    7519 2016-05-22 12:30:00 20.805
    

    但现在我无法计算温度超过阈值的事件持续时间。我不知道如何识别连接期并计算其持续时间?

如果您有这个问题的解决方案,我会很高兴(这是我的第一个帖子,所以请原谅小错误)如果您需要有关我的数据的更多信息,请随时询问。

【问题讨论】:

  • max(rle(dataset$temp> 20)[rle(dataset$temp> 20)$values == T]$lengths) 应该适用于您的第一个目标,以防您的数据在整个数据集中具有相同的时间间隔(如您的示例中所示)
  • 你能提供你预期的输出吗?例如。根据样本数据等,您希望持续多长时间。
  • @Lenvyy:感谢您的回答,不知道 rle() 函数。不幸的是,它不适用于我的数据。我明白了,但我无法产生结果。数据是填空的,因此间隔相同,但函数产生 NULL。但是通过使用 rle() 函数,我找到了一个解决方案,通过使用 r=rle(df$Temp>20) tapply(r$lengths, r$values, max) @arg0naut:我希望它是几小时内

标签: r time xts duration threshold


【解决方案1】:

这可能有效。我以这个数据为例:

df <- structure(list(Time = structure(c(1463911500, 1463911800, 1463912100, 
1463912400, 1463912700, 1463913000), class = c("POSIXct", "POSIXt"
), tzone = ""), Temp = c(20.043, 20.234, 6.329, 20.424, 20.615, 
20.805)), row.names = c(NA, -6L), class = "data.frame")

> df
                 Time   Temp
1 2016-05-22 12:05:00 20.043
2 2016-05-22 12:10:00 20.234
3 2016-05-22 12:15:00  6.329
4 2016-05-22 12:20:00 20.424
5 2016-05-22 12:25:00 20.615
6 2016-05-22 12:30:00 20.805

library(dplyr)
df %>% 
  # add id for different periods/events
  mutate(tmp_Temp = Temp > 20, id = rleid(tmp_Temp)) %>% 
  # keep only periods with high temperature
  filter(tmp_Temp) %>%
  # for each period/event, get its duration
  group_by(id) %>%
  summarise(event_duration = difftime(last(Time), first(Time)))


     id event_duration
  <int> <time>        
1     1  5 mins       
2     3 10 mins       

【讨论】:

  • 谢谢,正是我想要的!
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2021-08-15
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多