【问题标题】:Annual, monthly or daily mean for irregular time series不规则时间序列的年、月或日平均值
【发布时间】:2013-07-13 13:20:05
【问题描述】:

我是“R”的新用户,我找不到一个好的解决方案来解决它。我得到了以下格式的时间序列:

>dates  temperature depth   salinity
>12/03/2012 11:26   9.7533  0.48073 37.607
>12/03/2012 11:56   9.6673  0.33281 37.662
>12/03/2012 12:26   9.6673  0.33281 37.672

我的可变测量频率不规则,根据时间段每 15 分钟或每 30 分钟进行一次。我想计算每个变量的年、月和日平均值,无论一天/月/年的数据数量是多少。我阅读了很多关于软件包 zoo、timeseries、xts 等的内容,但我无法清楚地了解我需要什么(可能是因为我对 R 的熟练程度不够......)。

我希望我的帖子很清楚,如果不是,请随时告诉我。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    将您的数据转换为 xts 对象,然后使用 apply.daily 等计算您想要的任何值。

    library(xts)
    d <- structure(list(dates = c("12/03/2012 11:26", "12/03/2012 11:56", 
    "12/03/2012 12:26"), temperature = c(9.7533, 9.6673, 9.6673), 
        depth = c(0.48073, 0.33281, 0.33281), salinity = c(37.607, 
        37.662, 37.672)), .Names = c("dates", "temperature", "depth", 
    "salinity"), row.names = c(NA, -3L), class = "data.frame")
    x <- xts(d[,-1], as.POSIXct(d[,1], format="%m/%d/%Y %H:%M"))
    apply.daily(x, colMeans)
    #                     temperature     depth salinity
    # 2012-12-03 12:26:00    9.695967 0.3821167   37.647
    

    【讨论】:

    • 非常感谢您的回答。优点是使用 xts 我可以要求每周平均值。我尝试了你的代码,我的整个数据集出现了一些问题,所以我尝试修复它,我会与你保持联系!再次感谢!
    • 没关系,只是日月颠倒了(%m/%d >>> %d/%m)。谢谢!
    【解决方案2】:

    我会将日、月和年添加到数据框中,然后使用aggregate()

    首先将您的 date 列转换为 POSIXct 对象:

    d$timestamp <- as.POSIXct(d$dates,format = "%m/%d/%Y %H:%M",tz ="GMT")
    

    然后将日期(例如 12/03/2012)放入名为 Date 的列中,试试这个:

    d$Date <- format(d$timestamp,"%y-%m-%d",tz = "GMT")
    

    接下来,按日期汇总:

    aggregate(cbind("temperature.mean" = temperature,
                    "salinity.mean" = salinity) ~ Date,
              data = d,
              FUN = mean)
    

    同样,您可以将月份放入一列中(我们称其为 M 表示月份),然后...

    d$M <- format(d$timestamp,"%B",tz = "GMT")
    
    aggregate(cbind("temperature.mean" = temperature,
                    "salinity.mean" = salinity) ~ M,
              data = d,
              FUN = mean)
    

    或者如果你想要年月

    d$YM <- format(d$timestamp,"%y-%B",tz = "GMT")
    
    aggregate(cbind("temperature.mean" = temperature,
                    "salinity.mean" = salinity) ~ YM,
              data = d,
              FUN = mean)
    

    如果您的数据中有任何 NA 值,您可能需要考虑这些:

    aggregate(cbind("temperature.mean" = temperature,
                    "salinity.mean" = salinity) ~ YM,
              data = d,
              function(x) mean(x,na.rm = TRUE))
    

    最后,如果您想按周平均,您也可以这样做。先生成周数,然后再使用aggregate()

    d$W <- format(d$timestamp,"%W",tz = "GMT")
    
    aggregate(cbind("temperature.mean" = temperature,
                    "salinity.mean" = salinity) ~ W,
              data = d,
              function(x) mean(x,na.rm = TRUE))
    

    此版本的周数将第 1 周定义为一年中第一个星期一所在的那一周。周是从星期一到星期日。

    【讨论】:

    • 您对format 的调用将不起作用。 dates 列不是 POSIXct 对象。它要么是一个角色,要么(更有可能)是一个因素。
    • @JoshuaUlrich 注意。固定。
    • 非常感谢您的回答!这在我也为答案 1 所做的更改之后非常有效(日期和月份倒置,我想这是国家/地区的差异,因为在法国,我们给出了一个月前的一天;)。就像我问 Jdbaba 一样,有没有办法像 xts 库一样使用库播放器计算每周平均值?
    • 不错不错!非常感谢!
    【解决方案3】:

    然而,使用 plyr 的另一种方法:

    df <- structure(list(dates = c("12/03/2012 11:26", "12/03/2012 11:56", 
       "12/03/2012 12:26"), temperature = c(9.7533, 9.6673, 9.6673), 
       depth = c(0.48073, 0.33281, 0.33281), salinity = c(37.607, 
       37.662, 37.672)), .Names = c("dates", "temperature", "depth",                                                                                                
      "salinity"), row.names = c(NA, -3L), class = "data.frame")
    
    library(plyr)
    
    # Change date to POSIXct
    df$dates <- with(d,as.POSIXct(dates,format="%m/%d/%Y %H:%M"))
    
    # Make new variables, year and month
    df <- transform(d,month=as.numeric(format(dates,"%m")),year=as.numeric(format(dates,"%Y")))
    
    ## According to year
    ddply(df,.(year),summarize,meantemp=mean(temperature),meandepth=mean(depth),meansalinity=mean(salinity))
      year meantemp meandepth meansalinity
    1 2012 9.695967 0.3821167       37.647
    
    ## According to month
    ddply(df,.(month),summarize,meantemp=mean(temperature),meandepth=mean(depth),meansalinity=mean(salinity))
      month meantemp meandepth meansalinity
    1    12 9.695967 0.3821167       37.647
    

    【讨论】:

    • 非常感谢您的回答!这在我也为答案 1 所做的更改之后非常有效(日期和月份倒置,我想这是国家/地区的差异,因为在法国,我们给出了一个月前的一天;)。有没有办法像 xts 库一样使用库播放器计算每周平均值?
    【解决方案4】:

    hydroTSM 包有多种功能可以创建年度和其他摘要:

    daily2annual(x, ...)
    subdaily2annual(x, ...)
    monthly2annual(x, ...)
    annualfunction(x, FUN, na.rm = TRUE, ...)
    

    【讨论】:

      猜你喜欢
      • 2012-09-15
      • 2014-02-17
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多