【发布时间】:2021-09-29 17:44:24
【问题描述】:
我有不同长度的时间序列(通常为 1 到 14 天),样本之间的间隔为 15 秒。我需要使用带有一些预定义函数(中值、最小值、最大值等)的聚合为每个组保留所有数据的 N 点。原因 - 我想在绘图上显示它并且太多的点会造成混乱,最好拆分数据并显示中位数,或短时间间隔的最小值/最大值。
问题是,如果我使用 lubridate ceiling_date 函数进行聚合,我的聚合期真的很有限。它仅支持“N hours”或“N mins”格式,甚至不支持“75m”或“1500s”或“1 hours 5 mins”。
但我真正需要的是 - 将我的数据长度除以 N 并以秒为单位计算聚合间隔。假设我的数据长度是 8.68 天 = 8.682460*60 = 749952 秒。假设我想要200分。我的聚合周期应该是 749952/200 = 3749,76 ~ 3750 秒。但我必须用“2小时”来代替它。
这是我的示例数据代码:
library(dplyr)
library(lubridate)
set.seed(900)
data1 <-
data.frame(
datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
Value = sample(1:100, 50002, replace = T),
Instance = "C:"
)
data2 <- data.frame(
datetime = seq.POSIXt(as.POSIXct("2020-12-26 10:00:00"), as.POSIXct("2020-12-26 10:00:00") + 15*50001, "15 sec"),
Value = sample(1:100, 50002, replace = T),
Instance = "D:"
)
data <- rbind (data1, data2) %>% arrange(datetime)
data_lenght <-
difftime(max(data$datetime), min(data$datetime), units = "secs")
agg_interval <- data_lenght / 200
if (agg_interval > 3600) {
N_hours <- ceiling(agg_interval / 60 / 60)
agg_period <- paste0(N_hours, " hours")
} else {
N_minutes <- ceiling(agg_interval / 60)
agg_period <- paste0(N_minutes, " mins")
}
agg_data <-
data %>% group_by(across(-c(Value, datetime)), datetime = ceiling_date (datetime, agg_period)) %>%
summarise (Value = median(Value) , .groups = "drop")
结果:
# A tibble: 212 x 3
Instance datetime Value
<chr> <dttm> <dbl>
1 C: 2020-12-26 10:00:00 85
2 C: 2020-12-26 12:00:00 53
3 C: 2020-12-26 14:00:00 48.5
4 C: 2020-12-26 16:00:00 50
5 C: 2020-12-26 18:00:00 52
6 C: 2020-12-26 20:00:00 50.5
7 C: 2020-12-26 22:00:00 51
8 C: 2020-12-27 00:00:00 48
9 C: 2020-12-27 02:00:00 47
10 C: 2020-12-27 04:00:00 47
# ... with 202 more rows
另一个问题,稍后在我的代码中,我需要将聚合周期转换为秒。但它是文本:“15 分钟”、“55 分钟”、“3 小时”等。真的很难处理。
有没有比我使用秒作为整数而不是像我这样的文本更简单的方法来进行聚合?
更新:如果我尝试以秒为单位使用间隔:
agg_interval <- round (data_lenght / 200 / 15) * 15
agg_period <- paste0(agg_interval, " secs")
agg_data <-
data %>% group_by(across(-c(Value, datetime)), datetime = ceiling_date (datetime, agg_period)) %>%
summarise (Value = median(Value) , .groups = "drop")
结果是 - 没有发生聚合:
# A tibble: 50,004 x 3
Instance datetime Value
<chr> <dttm> <int>
1 C: 2020-12-26 10:00:00 85
2 C: 2020-12-26 10:01:00 19
3 C: 2020-12-26 10:02:00 43
4 C: 2020-12-26 10:03:00 83
5 C: 2020-12-26 10:04:00 67
6 C: 2020-12-26 10:05:00 28
7 C: 2020-12-26 10:06:00 54
8 C: 2020-12-26 10:07:00 28
9 C: 2020-12-26 10:08:00 99
10 C: 2020-12-26 10:09:00 54
# ... with 49,994 more rows
【问题讨论】:
标签: r dplyr time-series aggregate lubridate