【问题标题】:How to aggregate using water years (oct 1 2008- sept 31 2009)如何使用水年汇总(2008 年 10 月 1 日- 2009 年 9 月 31 日)
【发布时间】:2025-12-02 02:40:01
【问题描述】:

我有使用 R 每天测量降水的数据。我的日期格式为 2008-01-01,范围为 10 年。我正在尝试从 2008-10-01 汇总到 2009-09-31,但我不确定如何。有没有办法在聚合中设置聚合和分组的开始日期。

我当前的代码是

data<- aggregate(data$total_snow_cm, by=list(data$year), FUN = 'sum')

但是这个输出给了我从 1 月到 12 月每年降雪的总和,但我希望它包括 oct / 08 到 sept / 09。

【问题讨论】:

标签: r aggregate


【解决方案1】:

假设您的数据是长格式,我会这样做:

 library(tidyverse)

 #make sure R knows your dates are dates - you mention they're 'yyyy-mm-dd', so
 yourdataframe <- yourdataframe %>% 
                  mutate(yourcolumnforprecipdate = ymd(yourcolumnforprecipdate) 


 #in this script or another, define a water year function
 water_year <- function(date) {
               ifelse(month(date) < 10, year(date), year(date)+1)}

 #new wateryear column for your data, using your new function
 yourdataframe <- yourdataframe %>% 
                  mutate(wateryear = water_year(yourcolumnforprecipdate)

 #now group by water year (and location if there's more than one) 
 #and sum and create new data.frame

 wy_sums <- yourdataframe %>% group_by(locationcolumn, wateryear) %>% 
            summarize(wy_totalprecip = sum(dailyprecip))

有关更多信息,请阅读 tidyverse 的名为 lubridate 的伟大子库 - ymd() 函数来自哪里。还有其他类似ymd_hms()mutate() 来自 tidyverse 的 dplyr 库。这两个库都非常有用!

【讨论】:

  • 太棒了!欢迎来到 SO!仅供参考,正如@Shree 所提到的,如果您在问题中包含一些示例数据(例如您的时间序列的一小部分),您将获得迄今为止最好的答案。说这个,包括从2008-09-252008-10-05 的十天左右的时间,足以让其他人快速剪切和粘贴您的数据并提出解决方案。
【解决方案2】:

我想给出问题的实际答案,其中aggregate() 方式被问到了。

您可以使用with() 将数据规范包装在aggregate() 周围。在with() 中,您可以像使用数字一样定义日期间隔。

df1.agg <- with(df1[as.Date("2008-10-01") <= df1$year & df1$year <= as.Date("2009-09-30"), ], 
                aggregate(total_snow_cm, by=list(year), FUN=sum))

另一种方法是使用aggregate()的公式接口,其中data,因此也可以在aggregate()调用中指定间隔。

df1.agg <- aggregate(total_snow_cm ~ year, 
                     data=df1[as.Date("2008-10-01") <= df1$year & 
                                df1$year <= as.Date("2009-09-30"), ], FUN=sum)

结果

head(df1.agg)
#         year total_snow_cm
# 1 2008-10-01           171
# 2 2008-10-02           226
# 3 2008-10-03           182
# 4 2008-10-04           129
# 5 2008-10-05           135
# 6 2008-10-06           222

数据

set.seed(42)
df1 <- data.frame(total_snow_cm=sample(120:240, 4018, replace=TRUE),
                  year=seq(as.Date("2000-01-01"),as.Date("2010-12-31"), by="day"))

【讨论】: