5

我有一个看起来像这样的数据框:

     Timedate              TotalSolar_MW
20  2013-06-01 04:45:00     13.0
21  2013-06-01 05:00:00     41.7
22  2013-06-01 05:15:00     81.8
23  2013-06-01 05:30:00    153.0
24  2013-06-01 05:45:00    270.7
25  2013-06-01 06:00:00    429.3
26  2013-06-01 06:15:00    535.4

“时间日期”是POSIXlt,“Total_Solar”是numeric。时间步长从 6 月 1 日 0:00 到 6 月 24 日 24:00 以 15 分钟为间隔。

现在我想aggregate将季度数据按小时计算,例如 2013-06-01 06:00:00 934.8MW(81.8MW + 153.0MW + 270.7MW + 429.3MW;从 05:15 到 06:00)

我试过这个:

 Sum <-aggregate(Total_Solar_Gesamt$TotalSolar_MW, 
          list(as.POSIXlt(Total_Solar_Gesamt$Timedate)$hour), FUN=sum)

但它会返回整个数据帧的聚合小时数据,并给我一个新的 data.frame,它有 24 行和每小时的总和 MW。

我怎样才能改变结构,只是从四分之一小时减少到每小时间隔?我尝试了一个 for 循环,但这也没有用。也subset没有为我工作。

4

2 回答 2

8
Total_Solar_Gesamt <- read.table(header=TRUE, sep=",", text="
Timedate, TotalSolar_MW
2013-06-01 04:45:00, 13.0
2013-06-01 05:00:00, 41.7
2013-06-01 05:15:00, 81.8
2013-06-01 05:30:00, 153.0
2013-06-01 05:45:00, 270.7
2013-06-01 06:00:00, 429.3
2013-06-01 06:15:00, 535.4
")

用于cut.POSIXt将日期划分为每小时间隔:

Sum <- aggregate(Total_Solar_Gesamt["TotalSolar_MW"], 
                 list(hour=cut(as.POSIXct(Total_Solar_Gesamt$Timedate), "hour")),
                 sum)
Sum
                 hour TotalSolar_MW
1 2013-06-01 04:00:00          13.0
2 2013-06-01 05:00:00         547.2
3 2013-06-01 06:00:00         964.7

请注意,以上将 06:00:00 与其他 06 时间分组。如果要将一小时的开头与前一小时分组,只需从每个时间戳中减去一秒:

Sum2 <- aggregate(Total_Solar_Gesamt["TotalSolar_MW"], 
                 list(hour=cut(as.POSIXct(Total_Solar_Gesamt$Timedate)-1, "hour")),
                 sum)
Sum2
                 hour TotalSolar_MW
1 2013-06-01 04:00:00          54.7
2 2013-06-01 05:00:00         934.8
3 2013-06-01 06:00:00         535.4

而且,如果您想提前一小时报告您的日期,例如您的问题:

Sum2$adjustedHour <- as.POSIXct(Sum2$hour) + 3600
Sum2
                 hour TotalSolar_MW        adjustedHour
1 2013-06-01 04:00:00          54.7 2013-06-01 05:00:00
2 2013-06-01 05:00:00         934.8 2013-06-01 06:00:00
3 2013-06-01 06:00:00         535.4 2013-06-01 07:00:00

使用 xts:

library(xts)
data.xts <- xts(Total_Solar_Gesamt$TotalSolar_MW, 
                as.POSIXct(Total_Solar_Gesamt$Timedate)-1)  
                # subtract 1 second, as discussed above
Sum.xts <- period.apply(data.xts, INDEX=endpoints(data.xts, "hours"), FUN=sum)
Sum.xts
                     [,1]
2013-06-01 04:59:59  54.7
2013-06-01 05:59:59 934.8
2013-06-01 06:14:59 535.4

注意 xts 中的时间戳Sum.xts是每小时的最后一个时间戳。xts 可以很容易地对齐它们:

Sum.xts <- align.time(Sum.xts, 3600)  # round up to next hour

Sum.xts
                     [,1]
2013-06-01 05:00:00  54.7
2013-06-01 06:00:00 934.8
2013-06-01 07:00:00 535.4
于 2015-07-26T01:48:01.263 回答
6

在使用时间序列时,我建议您xts为此使用包,例如hourly.apply

 library(xts)
 dat.xts <- xts(Total_Solar_Gesamt$TotalSolar_MW,
                as.POSIXct(otal_Solar_Gesamt$Timedate))
 hourly.apply(dat.xts,sum)

更一般地说,您可以使用period.applywhich is ( lapplyequivalent) ,例如每 2 小时汇总一次数据,您可以执行以下操作:

 ends <- endpoints(zoo.data,'hours',2) 
 period.apply(dat.xts,ends ,sum)
于 2013-06-30T10:59:36.007 回答