2013-06-30 58 views
1

我有一個數據幀,看起來像這樣:聚合值步驟

 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 

「TIMEDATE」是POSIXlt和「Total_Solar」是numeric。從6月1日0:00至6月24日24:00,時間間隔爲15分鐘。

現在我想要aggregate每小時的小時數據到小時的步驟,例如, 2013年6月1日6時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) 

但是它返回了整個數據框的聚合小時數據,並給了我一個新的數據框,其中有24行,並且每小時總結了MW。

我怎樣才能改變結構,只能從一個小時減少到一個小時?我嘗試了一個for循環,但這也沒有奏效。 subset也不適合我。

感謝您的幫助!

+2

請務必提供[**重複的例子,**](http://stackoverflow.com/questions/5963269/how-to-make-a-great -r-reproducible-example)爲您的問題。 – Arun

+0

除了缺少可重複使用的示例,一般建議,避免使用** POSIXlt **,它是**列表** /不是數字,很難用於分組。 – agstudy

+0

對不起!我在這裏很新,忘記了可重複的例子 –

回答

4

當時間序列的工作,我建議你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.apply這是(lapply當量),例如收集您的數據每次2小時就可以做到以下幾點:

ends <- endpoints(zoo.data,'hours',2) 
period.apply(dat.xts,ends ,sum) 
+3

hourly.apply()似乎不存在。見[這個SO回答](http:// stackoverflow。com/a/30588384/215945)。 –

2
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