簡體   English   中英

如何根據指定的開始時間從數據框中提取多個 5 分鍾平均值?

[英]How to extract multiple 5-minute averages from a data frame based on specified start time?

我有通道 A、B 和 C 的逐秒數據,如下所示(這僅顯示前 6 行):

                 date        A        B        C
1 2020-03-06 09:55:42 224.3763 222.3763 226.3763
2 2020-03-06 09:55:43 224.2221 222.2221 226.2221
3 2020-03-06 09:55:44 224.2239 222.2239 226.2239
4 2020-03-06 09:55:45 224.2044 222.2044 226.2044
5 2020-03-06 09:55:46 224.2397 222.2397 226.2397
6 2020-03-06 09:55:47 224.3690 222.3690 226.3690

我希望能夠根據關閉時間提取 A、B 和 C 列的多個 5 分鍾平均值。 有沒有辦法做到這一點,我只需要輸入開始時間段,而不必為我要提取的每個時間段輸入開始和結束時間? 本質上,我希望能夠輸入開始時間並讓我的代碼計算並提取連續 5 分鍾的平均值。

我以前使用'openair' package 中的'time.average' function 來獲得整個數據集的1分鍾平均值。 然后我創建了一個帶有開始時間的向量,然后使用“子集”函數來提取我感興趣的 1 分鍾平均值。

library(openair)
df.avg <- timeAverage(df, avg.time = "min", statistic = "mean")
cond.1.time <- c(
  '2020-03-06 10:09:00', 
  '2020-03-06 10:13:00',
  '2020-03-06 10:18:00',
) #enter start times
library(dplyr)
df.cond.1.avg <- subset(df.avg,
                           date %in% cond.1.time)  #filter data based off vector
df.cond.1.avg <- as.data.frame(df.cond.1.avg) #tibble to df

但是,這種方法不適用於 5 分鍾的平均值,因為並非我感興趣的所有時間框架都以 5 分鍾的增量開始。 此外,我之前的方法迫使我只使用從一分鍾開始的 1 分鍾平均值。

我需要能夠提取全天隨機分布的 5 分鍾平均值。 這些不是滾動平均值。 我需要每天提取大約 30 個 5 分鍾的平均值,因此只能輸入開始日期是關鍵。

謝謝!

使用dplyrtidyr庫,可以通過過濾日期和平均來選擇要平均的間隔。 它似乎沒有效率,但它可以幫助你。

library(dplyr)
library(tidyr)
data <- data.frame(date = seq(as.POSIXct("2020-02-01 01:01:01"),
                              as.POSIXct("2020-02-01 20:01:10"),
                              by = "sec"),
                   A = rnorm(68410),
                   B = rnorm(68410),
                   C = rnorm(68410))

meanMinutes <- function(data, start, interval){
  # Interval in minutes
  start <- as.POSIXct(start)
  end <- start + 60*interval
  filterData <- dplyr::filter(data, date <= end, date >= start)
  date_start <- filterData$date[1]
  meanData <- filterData %>% 
    tidyr::gather(key = "param", value = "value", A:C) %>% 
    dplyr::group_by(param) %>% 
    dplyr::summarise(value = mean(value, na.rm = T)) %>% 
    tidyr::spread(key = "param", value = "value")
  return(cbind(date_start, meanData))
}

一次約會

meanMinutes(data, "2020-02-01 07:03:11", 5)

結果:

           date_start           A           B          C
1 2020-02-01 07:03:11 0.004083064 -0.06067075 -0.1304691

對於多個日期:

dates <- c("2020-02-01 02:53:41", "2020-02-01 05:23:14", 
           "2020-02-01 07:03:11", "2020-02-01 19:10:45")
do.call(rbind, lapply(dates, function(x) meanMinutes(data, x, 5)))

結果:

           date_start            A           B           C
1 2020-02-01 02:53:41 -0.001929374 -0.03807152  0.06072332
2 2020-02-01 05:23:14  0.009494321 -0.05911055 -0.02698245
3 2020-02-01 07:03:11  0.004083064 -0.06067075 -0.13046909
4 2020-02-01 19:10:45 -0.123574816 -0.02373881  0.05997007

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM