计算 R 中超过阈值的最大持续时间(时间序列)
Calculation of the maximum duration over threshold in R (timeseries)
我有一个 5 分钟分辨率的 xts 时间序列温度数据。
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
- 我想计算温度超过某个阈值的最长持续时间。 (假设 20 °C)
- 我想计算温度超过特定阈值的所有时间段。
我从我的 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
然后我创建一个仅包含超过阈值的数据的子集:
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
但现在我无法计算温度超过阈值的事件持续时间。我不知道如何识别连接期并计算其持续时间?
如果你能解决这个问题,我会很高兴(这是我的第一个话题,所以请原谅小错误)如果你需要更多关于我的数据的信息,请随时询问。
这可能有效。我以这个数据为例:
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
我有一个 5 分钟分辨率的 xts 时间序列温度数据。
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
- 我想计算温度超过某个阈值的最长持续时间。 (假设 20 °C)
- 我想计算温度超过特定阈值的所有时间段。
我从我的 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
然后我创建一个仅包含超过阈值的数据的子集:
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
但现在我无法计算温度超过阈值的事件持续时间。我不知道如何识别连接期并计算其持续时间?
如果你能解决这个问题,我会很高兴(这是我的第一个话题,所以请原谅小错误)如果你需要更多关于我的数据的信息,请随时询问。
这可能有效。我以这个数据为例:
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