2012-02-05 56 views
3

我有一個動物園對象,它包括時間戳(到第二個)時間序列。時間序列是不規則的,因爲這些值之間的時間間隔沒有規律的間隔。按時鐘時間(即不只是在動物園對象中的時間)聚合時間戳動物園對象

我想將不規則間隔的時間序列對象轉換爲規則間隔的對象,其中值之間的時間間隔是常量 - 比如15分鐘,並且是「現實世界」時鐘時間。

一些樣本數據可能有助於說明進一步

# Sample data 
2011-05-05 09:30:04 101.32 
2011-05-05 09:30:14 100.09 
2011-05-05 09:30:19 99.89 
2011-05-05 09:30:35 89.66 
2011-05-05 09:30:45 95.16 
2011-05-05 09:31:12 100.28 
2011-05-05 09:31:50 100.28 
2011-05-05 09:32:10 98.28 

我想(用我的自定義函數)對每個指定的時間段聚集它們(例如,30第二次桶),使得輸出看起來象表格如下。

關鍵是我希望按照時鐘時間每隔30秒聚合一次,而不是從我的第一次觀察時間開始30秒。當然,第一次存儲桶將是第一次存儲桶,在這個存儲桶中我將在要彙總的數據中記錄觀察值(即行)。

2011-05-05 09:30:00 101.32 
2011-05-05 09:30:30 89.66 
2011-05-05 09:31:00 100.28 

在給出的例子中,我的自定義集合函數簡單地在「選擇的行」聚集超過「設置」返回第一個值。

回答

5

讀入的數據,然後通過聚合分鐘吧:

Lines <- "2011-05-05 09:30:04 101.32 
2011-05-05 09:30:14 100.09 
2011-05-05 09:30:19 99.89 
2011-05-05 09:30:35 89.66 
2011-05-05 09:30:45 95.16 
2011-05-05 09:31:12 100.28 
2011-05-05 09:31:50 100.28 
2011-05-05 09:32:10 98.28" 

library(zoo) 
library(chron) 
toChron <- function(d, t) as.chron(paste(d, t)) 
z <- read.zoo(text = Lines, index = 1:2, FUN = toChron) 
aggregate(z, trunc(time(z), "00:01:00"), mean) 

結果是:

(05/05/11 09:30:00) (05/05/11 09:31:00) (05/05/11 09:32:00) 
      97.224    100.280    98.280 
+0

簡潔的代碼...幾乎在那裏,但我想每30秒聚合,而不是每分鐘。 – 2012-02-06 09:24:07

+0

用30秒鐘將參考替換爲一分鐘。 – 2012-02-06 10:36:32

1

我只想截斷時間對你的間隔,所以假設t是時間(使用as.POSIXct如果它不是)

bucket = t - as.numeric(t) %% 30 

,那麼你可以通過聚合bucket,像aggregate(value, list(bucket), sum)

(我不't使用zoo所以這是純R)

0

你應該看看align.timexts。它與你想達到的目標非常接近。

my.data <- read.table(text="date,x 
2011-05-05 09:30:04,101.32 
2011-05-05 09:30:14,100.09 
2011-05-05 09:30:19,99.89 
2011-05-05 09:30:35,89.66 
2011-05-05 09:30:45,95.16 
2011-05-05 09:31:12,100.28 
2011-05-05 09:31:50,100.28 
2011-05-05 09:32:10,98.28", header=TRUE, as.is=TRUE,sep = ",") 

my.data <- xts(my.data[,2],as.POSIXlt(my.data[,1],format="%Y-%m-%d %H:%M:%S")) 

library(xts) 
res <-align.time(my.data,30) 
res[!duplicated(index(res)),] 

         [,1] 
2011-05-05 09:30:30 101.32 
2011-05-05 09:31:00 89.66 
2011-05-05 09:31:30 100.28 
2011-05-05 09:32:00 100.28 
2011-05-05 09:32:30 98.28 

如果使得解釋更清晰,則可以延遲30秒。

+0

我缺少的東西?我沒有看到(自定義)聚合正在進行的結果......結果看起來是正確的,但我不知道如何使用上面的代碼片段實現上述目標 – 2012-02-06 09:28:51

+0

您沒有告訴我們您想要如何聚合(意思是,VWAP ...)。我做了同樣的事情:只選擇每30秒第一筆交易的第一筆交易。這就是'!duplicated'所做的。 – 2012-02-06 13:54:22

2

我希望我們可以假設這是在動物園或xts對象。如果是這樣那麼試試這個:

# First get a start for a set of intervals, need to use your tz 
beg<- as.POSIXct(format(index(dat[1,]), "%Y-%m-%d %H:%M", tz="EST5EDT")) 
    # Then create a sequence of 30 second intervals 
tseq <- beg+seq(0,4*30, by=30) 
    # Then this will creat a vector than you can use for your aggregation fun 
findInterval(index(dat), tseq) 
    #[1] 1 1 1 2 2 3 4 5 
    # To find the first row in a subset of rows from tapply, try "[" with 1 
tapply(dat, findInterval(index(dat), tseq), "[", 1) 
    #  1  2  3  4  5 
    #101.32 89.66 100.28 100.28 98.28 
+0

我不會嘗試這種方法。有趣的...順便說一句,你能解釋爲什麼你使用4 * 30創建序列。我不明白那一部分。 – 2012-02-06 09:35:59

+0

你需要一個比你上次觀察更大的結束時間。如果你想計算(你可能應該),那麼你需要使用max(index(dat))+ 30來確保findInterval的區間向量足夠長。 – 2012-02-06 14:55:42