计算特定时间段的每日平均值

时间:2019-11-05 20:49:46

标签: r

我拥有50多年的每日数据。我需要使用每日数据的平均值生成一个新的数据集,每天应取平均值  包括过去10年和未来10年的每日数据。

这是一个可复制的示例。我有1998年至2008年的时间,还有2月和3月的10天。我需要做的是将T1和T2的新平均列分别计算为T1avg和T2avg。需要计算每日平均值,以便包含过去4年和未来4年的数据。要对1998-2001年和2005-2008年的平均df进行平均,因为这些年份之前或之后的4年都没有足够的数据。

例如2002年2月28日。我需要对02/28 / 1998、02 / 28 / 1999、02 / 28 / 2000、02 / 28 / 2001、02 / 28 / 2002,02 / 28 / 2003,02 / 28 / 2004,02 / 28 / 2005,02 / 28/2006。对于2004年2月29日,我的平均出价为02/29 / 200,02 / 29 / 2004,02 / 29/2008。

我尝试了sqldf。我可以每天进行平均,但无法弄清楚如何通过以年份介于4年和4年之间的年份为条件来计算平均值。

#Generate data
df<-as.data.frame(cbind(year=rep(1998:2008,each=20),

     month=c(rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10),rep(2:3,each=10), 
     rep(2:3,each=10),rep(2:3,each=10)),

    day=c(19:28,1:10,19:28,1:10,20:29,1:10,
    19:28,1:10,19:28,1:10,19:28,1:10,
    20:29,1:10,19:28,1:10,19:28,1:10,
    19:28,1:10,20:29,1:10),
T1=rnorm(220),
T2=rnorm(220)))

#####################平均每日数据####################### #

sqldf("
select
month,
day,
year,
T1,
T2,
  avg(T1) as T1_avg
  ,avg(T2) as T2_avg

  from df 
  group by 
   month, day
  ")

1 个答案:

答案 0 :(得分:0)

首先创建一个Datedate列,然后将数据框与其自身保持联接,以便对于第一个实例a中的每个日期,匹配第二个实例中的所有日期,b,在4年内。然后,根据aT1T2b每一列中的日期平均library(sqldf) df2 <- transform(df, date = as.Date(paste(year, month, day, sep = "-"))) df3 <- sqldf("select a.*, avg(b.T1) as avg_T1, avg(b.T2) as avg_T2 from df2 a left join df2 b on b.date between a.date - 4*365+1 and a.date + 4*365+1 group by a.date") 中的日期进行分组。

http-proxy my.VPS.IP.server 8080
http-proxy-option CUSTOM-HEADER X-Online-Host custom.website
http-proxy-option CUSTOM-HEADER Host custom.website