如何根据指定的开始时间从数据框中提取多个 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' 包中的 'time.average' 函数来获取整个数据集的 1 分钟平均值。然后我创建了一个包含开始时间的向量,然后使用 'subset' 函数提取我感兴趣的 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 分钟的平均值,因此能够只输入开始日期将是关键。
谢谢!
使用dplyr
和tidyr
库,可以通过筛选日期和平均来选择要平均的间隔。
好像效率不高,但是可以帮到你。
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
我有通道 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' 包中的 'time.average' 函数来获取整个数据集的 1 分钟平均值。然后我创建了一个包含开始时间的向量,然后使用 'subset' 函数提取我感兴趣的 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 分钟的平均值,因此能够只输入开始日期将是关键。
谢谢!
使用dplyr
和tidyr
库,可以通过筛选日期和平均来选择要平均的间隔。
好像效率不高,但是可以帮到你。
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