使用每分钟数据帧计算 12 点到凌晨 1 点之间的小时平均值:dplyr

Calculating an hour average between 12 and 1AM with per min dataframe: dplyr

我有多年的每分钟时间序列。

我需要为每个分钟数据点计算以下值:

q <- (Fn-Fd)/Fn

其中Fn为夜间12点到1点的平均F值,Fd为分钟数据点。

现在显然 Fn 每天都在变化,所以一种方法可能是使用 dplyr 函数计算 Fn,我需要创建某种循环或重新组织我的数据框...

虚拟数据:

#string of dates for a one month
datetime <- seq(
     from=as.POSIXct("2012-1-1 0:00:00", tz="UTC"),
     to=as.POSIXct("2012-2-1 0:00:00", tz="UTC"),
     by="min"
) 

#variable F
F <- runif(44641, min = 0, max =2)

#dataframe
df <- as.data.frame(cbind(datetime,F))
library(lubridate)
#make sure its in  "POSIXct" "POSIXt" format
df$datetime <- as_datetime(df$datetime)

或者一种不太优雅的方法可能是在第一次使用 dplyr 的时间间隔内自行获取 Fn - 我认为它会是这样的:

Fn <- df %>% 
  filter(between(as.numeric(format(datetime, "%H")), 0, 1)) %>% 
  group_by(hour=format(datetime, "%Y-%m-%d %H:")) %>%
  summarise(value=mean(df$F))

但我不确定我的语法是否正确?我是在计算每天凌晨 12 点到凌晨 1 点之间的平均 F 吗?

然后我可以将每天每一分钟的平均 Fn 值打印到我的数据框并进行简单计算以获得 Q。

在此先感谢您的建议。

也许是这样的?

library(dplyr)
library(lubridate)

df %>%
  group_by(Date = as.Date(datetime)) %>%
  mutate(F_mean = mean(F[hour(datetime) == 0]), 
         value = (F_mean - F)/F_mean) %>%
  ungroup() %>%
  select(-F_mean, -Date)


#             datetime     F  value
#   <dttm>              <dbl>  <dbl>
# 1 2012-01-01 00:00:00 1.97  -0.902
# 2 2012-01-01 00:01:00 0.194  0.813
# 3 2012-01-01 00:02:00 1.52  -0.467
# 4 2012-01-01 00:03:00 1.66  -0.599
# 5 2012-01-01 00:04:00 0.765  0.262
# 6 2012-01-01 00:05:00 1.31  -0.267
# 7 2012-01-01 00:06:00 1.62  -0.565
# 8 2012-01-01 00:07:00 0.642  0.380
# 9 2012-01-01 00:08:00 1.62  -0.560
#10 2012-01-01 00:09:00 1.68  -0.621
# ... with 44,631 more rows

我们首先 group_by 每个日期获取每天第 0 小时的 mean 值(值在 00:00 到 00:59 之间)并计算 value 使用给出的公式。