基础 R
bins <- seq(as.POSIXct("2020-01-19 00:30:00", tz = "UTC"), length.out = 5, by = "hour")
bins
# [1] "2020-01-19 00:30:00 UTC" "2020-01-19 01:30:00 UTC" "2020-01-19 02:30:00 UTC"
# [4] "2020-01-19 03:30:00 UTC" "2020-01-19 04:30:00 UTC"
dat$bin <- bins[ findInterval(dat$timestamp, bins) ]
dat
# timestamp int val bin
# 1 2020-01-19 01:30:00 1 25 2020-01-19 01:30:00
# 2 2020-01-19 01:40:00 1 70 2020-01-19 01:30:00
# 3 2020-01-19 01:50:00 1 68 2020-01-19 01:30:00
# 4 2020-01-19 02:00:00 1 53 2020-01-19 01:30:00
# 5 2020-01-19 02:10:00 1 63 2020-01-19 01:30:00
# 6 2020-01-19 02:20:00 1 65 2020-01-19 01:30:00
# 7 2020-01-19 02:30:00 1 52 2020-01-19 02:30:00
aggregate(val ~ bin, data = dat, FUN = min)
# bin val
# 1 2020-01-19 01:30:00 25
# 2 2020-01-19 02:30:00 52
如果您需要添加包含该组时间最小值的列(保留行),则
do.call(rbind, by(dat, dat$bin, function(z) transform(z, minval = min(val))))
# timestamp int val bin minval
# 2020-01-19 01:30:00.1 2020-01-19 01:30:00 1 25 2020-01-19 01:30:00 25
# 2020-01-19 01:30:00.2 2020-01-19 01:40:00 1 70 2020-01-19 01:30:00 25
# 2020-01-19 01:30:00.3 2020-01-19 01:50:00 1 68 2020-01-19 01:30:00 25
# 2020-01-19 01:30:00.4 2020-01-19 02:00:00 1 53 2020-01-19 01:30:00 25
# 2020-01-19 01:30:00.5 2020-01-19 02:10:00 1 63 2020-01-19 01:30:00 25
# 2020-01-19 01:30:00.6 2020-01-19 02:20:00 1 65 2020-01-19 01:30:00 25
# 2020-01-19 02:30:00 2020-01-19 02:30:00 1 52 2020-01-19 02:30:00 52
tidyverse
library(dplyr)
# using `bins` from above
dat %>%
mutate(bin = bins[ findInterval(timestamp, bins) ]) %>%
group_by(bin) %>%
summarize(val = min(val), .groups = "drop")
# # A tibble: 2 x 2
# bin val
# <dttm> <dbl>
# 1 2020-01-19 01:30:00 25
# 2 2020-01-19 02:30:00 52
或
dat %>%
mutate(bin = bins[ findInterval(timestamp, bins) ]) %>%
group_by(bin) %>%
mutate(minval = min(val)) %>%
ungroup()
# # A tibble: 7 x 5
# timestamp int val bin minval
# <dttm> <int> <dbl> <dttm> <dbl>
# 1 2020-01-19 01:30:00 1 25 2020-01-19 01:30:00 25
# 2 2020-01-19 01:40:00 1 70 2020-01-19 01:30:00 25
# 3 2020-01-19 01:50:00 1 68 2020-01-19 01:30:00 25
# 4 2020-01-19 02:00:00 1 53 2020-01-19 01:30:00 25
# 5 2020-01-19 02:10:00 1 63 2020-01-19 01:30:00 25
# 6 2020-01-19 02:20:00 1 65 2020-01-19 01:30:00 25
# 7 2020-01-19 02:30:00 1 52 2020-01-19 02:30:00 52
数据表
library(data.table)
# using
datDT[, bin := bins[ findInterval(timestamp, bins) ] ][, .(val = min(val)), by = .(bin) ]
# bin val
# <POSc> <num>
# 1: 2020-01-19 01:30:00 25
# 2: 2020-01-19 02:30:00 52
或
datDT[, bin := bins[ findInterval(timestamp, bins) ] ][, minval := min(val), by = .(bin) ]
datDT
# timestamp int val bin minval
# <POSc> <int> <num> <POSc> <num>
# 1: 2020-01-19 01:30:00 1 25 2020-01-19 01:30:00 25
# 2: 2020-01-19 01:40:00 1 70 2020-01-19 01:30:00 25
# 3: 2020-01-19 01:50:00 1 68 2020-01-19 01:30:00 25
# 4: 2020-01-19 02:00:00 1 53 2020-01-19 01:30:00 25
# 5: 2020-01-19 02:10:00 1 63 2020-01-19 01:30:00 25
# 6: 2020-01-19 02:20:00 1 65 2020-01-19 01:30:00 25
# 7: 2020-01-19 02:30:00 1 52 2020-01-19 02:30:00 52