R语言 使用基于日期的聚合数据运行循环

qqrboqgw  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(211)

我有一个很大的年度数据集,其中每个小时都包含一个值。我感兴趣的是每天的值或几天的值。在我的脚本中,我指定了感兴趣的开始和结束日期,并在一个单独的R脚本("run_seq. R")中根据每个小时的值聚合数据。

Date_From <- '2022-04-01'
Date_To <- '2022-04-02'
DF_hour<-(DfDHW %>%filter(as.Date(Hour) >= as.Date(Date_From) & as.Date(Hour) <= as.Date(Date_To)))
dummy<-as.numeric(DF_hour$Var*0+1)
dfdate <- aggregate(.~dummy, DFhour, sum)

这就像预期的那样工作。但是,我想在循环中对月份的几天重复这个操作。我所做的是创建一个"dates from"和"dates to"的序列以及一个数字序列号:

dates_from <- seq(as.Date("2022-04-01"), as.Date("2022-04-10"), by=1)
dates_to <- seq(as.Date("2022-04-02"), as.Date("2022-04-11"), by=1)
seq_num<-as.numeric(format(dates_from, format = "%d"))
df<-cbind.data.frame(dates_from, dates_to, seq_num)

| 日期_从|日期_至|序号|
| - ------| - ------| - ------|
| 2022年4月1日|2022年4月2日|1个|
| 二○二二年四月二日|2022年4月3日|第二章|
但是,如果运行for()循环,代码将选择所有的开始和结束日期,并聚合所有10天的数据。

for (x in seq_num) {
  source("run_seq.R") 
}

相反,我希望选择与每个序号(1,2,3 ...)对应的开始和结束日期,以便在第一个循环中选择序号1的开始/结束,在第二个循环中选择序号2的开始/结束,依此类推。
示例:循环1 =序号1:起始日期= 2022年4月2日;日期至= 2022年4月3日;循环2 =序列号2:起始日期= 2022年4月3日;日期至= 2022年4月4日;
DfDHW数据如下所示(总共37个变量,8760行):
| 小时|变量1|变量2|
| - ------| - ------| - ------|
| 2022年1月1日01时00分|一点四八零|一点四八零|
| 2022年1月1日02时00分|零点九五七|零点九五七|
dput(水头(DfDHW)产量:

structure(list(Hour = structure(c(1640995200, 1640998800, 1641002400, 
1641006000, 1641009600, 1641013200), class = c("POSIXct", "POSIXt"
), tzone = "Europe/Stockholm"), Var1 = c(1.48022736417965, 
0.957129616195086, 0.67616277119973, 0.516807667014335, 0.500124643187317, 
0.596748739907164), Var2 = c(1.48022736417965, 0.957129616195086, 
0.67616277119973, 0.516807667014335, 0.500124643187317, 0.596748739907164
), Var3 = c(1.48022736417965, 0.957129616195086, ...

我该怎么做呢?或者有没有更优雅的方法?

5ssjco0h

5ssjco0h1#

一种数据过滤方法

date_range <- seq(as.Date("2022-01-01"), as.Date("2022-01-04"), "day")

date_range <- data.frame(start = date_range[1:(length(date_range) - 1)], 
  end = date_range[2:length(date_range)])

date_range
       start        end
1 2022-01-01 2022-01-02
2 2022-01-02 2022-01-03
3 2022-01-03 2022-01-04

分别获取从“2022年1月1日”到“2022年1月2日”、“2022年1月2日”到“2022年1月3日”以及“2022年1月3日”到“2022年1月4日”的天数的sum

setNames(
  data.frame(apply(date_range, 1, function(x) 
    colSums(DfDHW[DfDHW$Hour >= x["start"] & 
      DfDHW$Hour < x["end"], c("Var1", "Var2")]))), 
  apply(date_range, 1, paste, collapse="_to_"))
     2022-01-01_to_2022-01-02 2022-01-02_to_2022-01-03 2022-01-03_to_2022-01-04
Var1                 4.727201                        0                        0
Var2                 4.727201                        0                        0
数据
DfDHW <- structure(list(Hour = structure(c(1640995200, 1640998800, 1641002400, 
1641006000, 1641009600, 1641013200), class = c("POSIXct", "POSIXt"
), tzone = "Europe/Stockholm"), Var1 = c(1.48022736417965, 0.957129616195086, 
0.67616277119973, 0.516807667014335, 0.500124643187317, 0.596748739907164
), Var2 = c(1.48022736417965, 0.957129616195086, 0.67616277119973, 
0.516807667014335, 0.500124643187317, 0.596748739907164)), class = "data.frame", row.names = c(NA, 
-6L))
z9smfwbn

z9smfwbn2#

我遵循Andre维尔德贝格的建议,在循环之前进行聚合。由于日期格式的原因,建议的过滤对我不起作用。相反:

library(dplyr)
Df <- Df2%>% 
  group_by(date=as.Date(Hour)) %>%
  summarise(across(6:221, sum))

这将所有小时值汇总为日值(sum),然后设置日期:

Date_From <- '2022-04-01'
Date_To <- '2022-04-04'

并在while循环中运行后台代码,另外为每个循环保存一个绘图。

start <- Date_From
end <- Date_To
Datum <- start
while (Datum <= end)
{
  Date_Input=Datum
  source("run_seq.R") 
  print(g)
  ggplot2::ggsave(filename = paste0("plot_",Date_Input,".png"),g, path = "Plots", width = 2560, height = 1440, units = "px")
  Datum <- as.Date(Datum) + 1                  
}

这似乎是可行的。也许for()循环会更快,但这样我就可以选择任何日期。

相关问题