【问题标题】:How to aggregate every 30 minutes in R如何在 R 中每 30 分钟聚合一次
【发布时间】:2017-03-08 05:51:25
【问题描述】:

我被困在 R 中。我需要将每分钟的数据汇总到每 30 分钟一次。我的数据框是这样的:

    Date        Time       Power
    2008-10-11  23:57:00   0.376
    2008-10-11  23:58:00   0.374
    2008-10-11  23:59:00   0.374
    2008-10-12  0:00:00    0.334
    2008-10-12  0:01:00    0.330
...
    2008-12-13  19:24:00   1.390
    2008-12-13  19:25:00   1.370
    2008-12-13  19:26:00   1.368
    2008-12-13  19:27:00   1.362
    2008-12-13  19:28:00   1.352
    2008-12-13  19:29:00   1.360

...

基本上,我有 2008 年的 500,979 行数据。每分钟给出一个功率值。为了做时间序列,我需要每 30 分钟聚合一次数据。这最终会给我大约 17,520 行。我的问题是:

  1. 如果 Power 列有一些缺失值,是否可以绘制时间序列?

  2. 请问如何按 30 分钟汇总 Power 值? (例如,0:00:00 到 0:29:00;0:30:00 到 0:59:00)

非常感谢!

【问题讨论】:

    标签: r plot time-series aggregate


    【解决方案1】:

    使用magrittrdplyr,您可以生成一个新列来保存一个分组变量,给出测量所在的时间单位,然后summarise 来计算您想要的任何聚合指标。 (注意%<>% 将管道的结果保存回原始变量中)。

    我不确定你的时间已经是什么格式了,当我读到它时它只是一个字符,所以将它转换为数字小时需要做一些事情。如果它已经为您提供了其他格式,那么该步骤可能会更容易。

    df %<>%
      mutate(cleanTime =
               strsplit(Time, ":") %>%
               sapply(function(x){
                 x <- as.numeric(x)
                 x[1] + x[2]/60 + x[3]/(60*60)
               })
             , roundTime = floor(cleanTime * 2)/2
             )
    

    然后,按生成的变量分组,并获取您想要的任何聚合统计信息:

    df %>%
      group_by(Date, roundTime) %>%
      summarise(avgPower = mean(Power)
                , sumPower = sum(Power))
    

    给予:

            Date roundTime  avgPower sumPower
          <date>     <dbl>     <dbl>    <dbl>
    1 2008-10-11      23.5 0.3746667    1.124
    2 2008-10-12       0.0 0.3320000    0.664
    3 2008-12-13      19.0 1.3670000    8.202
    

    【讨论】:

    • 谢谢马克!我通过首先安装这两个包并将日期转换为数字来尝试您的方法,但仍然出现此错误:UseMethod(“mutate_”)中的错误:没有适用于“mutate_”的方法应用于类“函数”的对象请告知。 :)
    • df 是一个函数,如果你没有用你的数据覆盖它。将其替换为您的数据名称
    【解决方案2】:

    使用dplyr,您可以执行下一个操作(您可以将mean 更改为您的聚合函数):

    df %>%
      mutate(DateTime = as.POSIXct(paste(Date, Time))) %>%
      group_by(DateTime = cut(DateTime, breaks="30 min")) %>%
      summarize(Power = mean(Power))
    

    将导致下一个输出:

                 DateTime  Power
                   <fctr>  <dbl>
    1 2008-10-11 23:57:00 0.3576
    2 2008-12-13 18:57:00 1.3760
    3 2008-12-13 19:27:00 1.3580
    

    【讨论】:

    • 感谢 m0nhawk 但出现了同样的错误。请参考我对上述 Mark 评论的回复。
    • 有没有办法在每个小时的顶部和每半小时标记生成“漂亮”的休息时间,而不是 00:57:00 和 00:27:00 休息时间显示在这里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多