2012-03-26 30 views
3

我想從每分鐘數據的每一天的前5分鐘的時間系列數據,但前5分鐘不會發生在相同的因此使用類似xtsobj["T09:00/T09:05"]這樣的東西從第一個5分鐘開始更改後將不起作用。即有時它在上午9點20分開始或在早上而不是早上9點的某個其他隨機時間開始。從xts獲取或子集數據的每一天的前5分鐘

到目前爲止,我已經能夠使用的功能像於子集出每一天的第一分鐘:

k <- diff(index(xtsobj))> 10000 

xtsobj[c(1, which(k)+1)] 

即找到在較大10000秒的數據差距,但會從到發現每天的前5分鐘會變得更加困難,因爲數據並不總是均勻分佈。即第一分鐘和第5分鐘之間,可能存在由2排5列,因此使用類似:

xtsobj[c(1, which(k)+6)] 

,然後將結果結合在一起

並不總是準確。我希望可以使用像'第一'這樣的功能,但不知道如何在多天內完成此操作,也許這可能是最佳解決方案。有沒有更好的方式獲得這些信息?

非常感謝stackoverflow社區提前。

回答

4

split(xtsobj, "days")將創建一個清單,每天的XTS對象。

那麼你可以申請head到每一天

lapply(split(xtsobj, "days"), head, 5) 

或者更一般

lapply(split(xtsobj, "days"), function(x) { 
    x[1:5, ] 
}) 

最後,您可以rbind的日子裏一起回來,如果你想要的。

do.call(rbind, lapply(split(xtsobj, "days"), function(x) x[1:5, ])) 
+0

非常感謝!它完美的作品! – 2012-03-26 03:19:53

2

你用什麼包lubridate,首先每一天,根據您的排序變化的隨機找出起點,然後使用功能minutes

因此,這將是這樣的:

five_minutes_after = starting_point_each_day + minutes(5) 

然後你可以使用的xts通常的子集做這樣的事情:

5_min_period = paste(starting_point_each_day,five_minutes_after,sep='/') 

xtsobj[5_min_period] 

編輯:

@Joshua 我想這樣的作品,看看下面這個例子:

library(lubridate) 
x <- xts(cumsum(rnorm(20, 0, 0.1)), Sys.time() - seq(60,1200,60)) 

starting_point_each_day= index(x[1]) 
five_minutes_after = index(x[1]) + minutes(5) 
five_min_period = paste(starting_point_each_day,five_minutes_after,sep='/') 

x[five_min_period] 

在我前面的例子中,我犯了一個錯誤,我把引號之間的five_min_period。 你在指出約書亞嗎?此外,也許出發點是沒有必要的,只是:

until5min=paste('/',five_minutes_after,sep="") 
x[until5min] 
+0

'xtsobj ['5_min_period']'不起作用。您只能使用特定類型的字符串對xts對象進行分組。 – 2012-03-26 01:47:56

+0

@JoshuaUlrich我認爲它有效 – aatrujillob 2012-03-26 05:17:09

+0

我說'xtsobj ['5_min_period']'不會工作,因爲''5_min_period''不是字符串xts會識別的。很高興你糾正了錯誤。 – 2012-03-26 09:39:11