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

时间:2019-01-29 02:52:02

标签: r time-series average

我需要每年为我的数据计算季节性平均值,平均值的计算不在同一日历年中。我已经按日期定义了季节,并希望计算每年该时间段内的平均温度,降水量(例如12/21/198102/15/198212/21/198202/15/1983),因此上。

在R中是否有一种有效的方法?

以下是我的数据:

library(xts)
seq <- timeBasedSeq('1981-01-01/1985-06-30') 
Data <- xts(1:length(seq),seq) 

谢谢

2 个答案:

答案 0 :(得分:0)

这是一种使用tidyverse语法的数据中心定位方法(如果愿意,可以将其翻译为基数R):

library(tidyverse)

df_in <- tibble(
    date = seq(as.Date('1981-01-01'), as.Date('1985-06-30'), by = 'day'), 
    x = seq_along(date)
)

str(df_in)
#> Classes 'tbl_df', 'tbl' and 'data.frame':    1642 obs. of  2 variables:
#>  $ date: Date, format: "1981-01-01" "1981-01-02" ...
#>  $ x   : int  1 2 3 4 5 6 7 8 9 10 ...

df_out <- df_in %>% 
    # reformat data to keep months and days, but use identical year, so...
    mutate(same_year = as.Date(format(date, '1970-%m-%d'))) %>% 
    # ...we can subset to rows we care about with simpler logic
    filter(same_year < as.Date('1970-02-15') | same_year > as.Date('1970-12-21')) %>% 
    # shift so all in one year and use for grouping
    group_by(run = as.integer(format(date - 60, '%Y'))) %>% 
    summarise(    # aggregate each gruop
        start_date = min(date), 
        end_date = max(date), 
        mean_x = mean(x)
    )

df_out
#> # A tibble: 5 x 4
#>     run start_date end_date   mean_x
#>   <int> <date>     <date>      <dbl>
#> 1  1980 1981-01-01 1981-02-14     23
#> 2  1981 1981-12-22 1982-02-14    383
#> 3  1982 1982-12-22 1983-02-14    748
#> 4  1983 1983-12-22 1984-02-14   1113
#> 5  1984 1984-12-22 1985-02-14   1479

答案 1 :(得分:0)

如果我们将时间提前11天,那么我们想要的日期是2月26日或之前的日期,因此让tt是这样的日期向量,而ok是逻辑向量,如果是,则为TRUE相应的tt元素在2月26日或之前。最后,在期末之前汇总Data[ok]

tt <- time(Data) + 11
ok <- format(tt, "%m-%d") < "02-26"
aggregate(Data[ok], as.integer(as.yearmon(tt))[ok], mean)

给予:

1981   23.0
1982  382.5
1983  747.5
1984 1112.5
1985 1478.5

如果您想在没有xts的情况下进行操作,那么假设我们的输入为DF,请尝试以下操作:

DF <- fortify.zoo(Data) # input

tt <- DF[, 1] + 11
ok <- format(tt, "%m-%d") < "02-26"
year <- as.numeric(format(tt, "%Y"))
aggregate(DF[ok, -1, drop = FALSE], list(year = year[ok]), mean)