如何在R中每30分钟聚合一次

时间:2016-10-26 02:00:46

标签: r plot time-series aggregate

我陷入了R.我需要将每分钟数据汇总到每30分钟。我的数据框是这样的:

trs = soup.find_all('tr')
for tr in trs:
    spans = tr.find_all('span')
    if spans.id == "ContentPlaceHolder1_grd_reminder_Label***":
        print spans.string

...

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

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

  2. 如何将Power值聚合30分钟? (例如,0:00:00到0:29:00; 0:30:00到0:59:00)

  3. 非常感谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用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