max*_*ann 3 aggregate r dataframe posixct
我有一个如下所示的数据框:
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
Run Code Online (Sandbox Code Playgroud)
"Timedate"是POSIXlt,而"Total_Solar"是numeric.时间步长为15分钟,从6月1日,0:00到6月24日,24:00.
现在我想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)
Run Code Online (Sandbox Code Playgroud)
但它返回整个数据框的聚合小时数据,并为我提供了一个新的data.frame,包含24行,每小时总计MW.
如何更改结构,只是从四分之一小时减少到每小时一次?我尝试了一个for循环,但这也没有用.也subset没对我工作.
谢谢您的帮助!
使用时间序列时,我建议您使用xts包,例如hourly.apply:
library(xts)
dat.xts <- xts(Total_Solar_Gesamt$TotalSolar_MW,
as.POSIXct(otal_Solar_Gesamt$Timedate))
hourly.apply(dat.xts,sum)
Run Code Online (Sandbox Code Playgroud)
更一般的是,您可以使用period.apply哪个(lapply等效),例如每2小时聚合您的数据,您可以执行以下操作:
ends <- endpoints(zoo.data,'hours',2)
period.apply(dat.xts,ends ,sum)
Run Code Online (Sandbox Code Playgroud)
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
")
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
请注意,以上内容会将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
Run Code Online (Sandbox Code Playgroud)
而且,如果您想提前一小时报告日期,例如您的问题:
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
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
请注意,使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13446 次 |
| 最近记录: |