从R中的时间序列数据中分离中的峰值

从R中的时间序列数据中分离中的峰值,r,R,我正在处理15分钟的流量数据,一列是datetime,一列是streamflow。我想编写代码,找到超过某个阈值的峰值风暴,然后选择后面的数据,直到数据下降到baseflow阈值。我想分离这些峰值和衰退部分,然后从水质指标的其他时间序列数据中选择相同的时间段 我尝试过pracma包的findpeaks函数,它给我的输出是峰值及其起点和终点的索引,但我不知道如何将这些索引转换回日期时间,以便我可以从其他时间序列中进行选择 我还尝试了Hystrostats包中的find.spell.length。它

我正在处理15分钟的流量数据,一列是datetime,一列是streamflow。我想编写代码,找到超过某个阈值的峰值风暴,然后选择后面的数据,直到数据下降到baseflow阈值。我想分离这些峰值和衰退部分,然后从水质指标的其他时间序列数据中选择相同的时间段

我尝试过pracma包的findpeaks函数,它给我的输出是峰值及其起点和终点的索引,但我不知道如何将这些索引转换回日期时间,以便我可以从其他时间序列中进行选择

我还尝试了Hystrostats包中的find.spell.length。它返回拼写长度,但我不知道如何将其转换回日期时间间隔。此外,这个软件包似乎是为每日数据而不是15分钟的数据设计的,所以我不知道这是否会扰乱结果


我是否应该使用不同的软件包或函数,或者有更好的方法来执行此操作?

您应该提供一些代码来指定正在使用的数据类型。如果您使用的是数据帧甚至向量,那么可以使用布尔索引

# a dataframe of dates and flows
df <- # dates and data

# initialize your threshold
threshold <- #something

# get the indices of data that are greater than threshold
peak_indices <- df$stream_data >= threshold

# dates that are cover the peak intervals
peak_dates <- df$dates[peak_indices]
编辑


没有看到您的评论,它是一个数据帧!对不起。

我想你差不多到了。我只是模拟了一些数据并使用了pracma软件包。您提到在返回日期时遇到问题,您要做的是使用findpeak调用返回的索引,并根据该索引对数据帧进行子集

例如,要获取绝对峰值的日期时间,请执行以下操作:

peaks <-findpeaks(stream_data$streamflow, minpeakheight = 1, minpeakdistance = 4, sortstr = FALSE)
stream_data[peaks[,2],"datetime"]
因此,请参阅下面有关如何回拨它们的代码

library(pracma)
#simulate data using pracma findpeaks example
x <- seq(0, 1, len = 1024)
     pos <- c(0.1, 0.13, 0.15, 0.23, 0.25, 0.40, 0.44, 0.65, 0.76, 0.78, 0.81)
     hgt <- c(4, 5, 3, 4, 5, 4.2, 2.1, 4.3, 3.1, 5.1, 4.2)
     wdt <- c(0.005, 0.005, 0.006, 0.01, 0.01, 0.03, 0.01, 0.01, 0.005, 0.008, 0.005)

pSignal <- numeric(length(x))
for (i in seq(along=pos)) {
             pSignal <- pSignal + hgt[i]/(1 + abs((x - pos[i])/wdt[i]))^4
     }

#give a datetime
START = as.POSIXlt("2018-09-07 10:00:00")
END = as.POSIXlt("2018-09-16 10:00:00")
#make your data frame
stream_data = data.frame(
       datetime=seq(START,END,length.out=length(pSignal)),
       streamflow=pSignal)
#plot
with(stream_data,plot(datetime,streamflow,type="l"))
#call peaks like you did
peak <-findpeaks(stream_data$streamflow, minpeakheight = 1, minpeakdistance = 4, sortstr = FALSE)
## call
data.frame(
       peak_number = 1:nrow(peak),
       peak_max = stream_data[peak[,2],"datetime"],
       peak_heigth = stream_data[peak[,2],"streamflow"],
       peak_start = stream_data[peak[,3],"datetime"],
       peak_end = stream_data[peak[,4],"datetime"]
)

嗨,贝基,我觉得普拉克玛套餐似乎还可以。也许您可以提供一个示例数据集,以及您尝试过的代码来提供帮助?一旦你有了索引,找回日期时间就不成问题了,所以我用了pracma这样的“不用担心”。所以你做了dputdf,它返回一个输出,它从结构开始,把它复制粘贴到你的帖子上。还包括您的代码。。是的,我可以快速查看dput的输出太长了,但我可以这样做:源头数据表:6 x 2日期时间流量2018-09-27 10:00:00 0.5502 2018-09-27 10:15:00 0.544 3 2018-09-27 10:30:00 0.534 2018-09-27 10:45:00 0.557 5 2018-09-27 11:00 0.536 2018-09-27 11:15:00 0.535查找我使用的峰值:“峰值谢谢这项建议。我将每个数据集作为data.frame加载。然后将其转换为xts,这样我就可以匹配各种时间序列数据集进行绘图