2010-03-14 39 views
5

從具有時間戳行的數據框(strptime結果),彙總間隔統計信息的最佳方法是什麼?什麼是有效的方法來分區和聚合數據框中時間戳記的行間隔?

間隔可能是一個小時,一天等

還有的aggregate功能,但不指定每行的間隔幫助。我打算在表示間隔的數據框中添加一列,並將其與aggregate一起使用,但如果有更好的解決方案,它聽起來會很棒。

感謝您的指點!


示例數據

五行,時間戳分爲起始於03:00 15分鐘的間隔。

間隔1

  • 「2010-01-13 3點02分38秒UTC」
  • 「2010-01-13 3點08分14秒UTC」
  • 「2010年01期-13三時14分52秒UTC」

間隔2

  • 「2010-01-13三時20分42秒UTC」
  • 「2010-01-13 3時22分十九秒UTC」

結論

使用時間系列包如xts應該是解決方案;然而,我沒有成功使用它們,並使用cut纏繞起來。由於我目前只需要繪製直方圖,並按行間隔分組,所以這已足夠。

cut使用喜歡這樣:

interv <- function(x, start, period, num.intervals) { 
    return(cut(x, as.POSIXlt(start)+0:num.intervals*period)) 
} 
+0

您可以使用'num.intervals'的默認值作爲'ceiling((max(x)-start)/ period)'。那麼你確定最大的時間戳會在一定的時間間隔內。 – Marek 2010-03-17 15:16:40

回答

6

標準功能分裂向量cutfindInterval

v <- as.POSIXct(c(
    "2010-01-13 03:02:38 UTC", 
    "2010-01-13 03:08:14 UTC", 
    "2010-01-13 03:14:52 UTC", 
    "2010-01-13 03:20:42 UTC", 
    "2010-01-13 03:22:19 UTC" 
)) 

# Your function return list: 
interv(v, as.POSIXlt("2010-01-13 03:00:00 UTC"), 900) 
# [[1]] 
# [1] "2010-01-13 03:00:00" 
# [[2]] 
# [1] "2010-01-13 03:00:00" 
# [[3]] 
# [1] "2010-01-13 03:00:00" 
# [[4]] 
# [1] "2010-01-13 03:15:00 CET" 
# [[5]] 
# [1] "2010-01-13 03:15:00 CET" 

# cut returns factor, you must provide proper breaks: 
cut(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900) 
# [1] 2010-01-13 03:00:00 2010-01-13 03:00:00 2010-01-13 03:00:00 
# [4] 2010-01-13 03:15:00 2010-01-13 03:15:00 
# Levels: 2010-01-13 03:00:00 2010-01-13 03:15:00 

# findInterval returns vector of interval id (breaks like in cut) 
findInterval(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900) 
# [1] 1 1 1 2 2 

根據記錄:cut具有用於POSIXt類型的方法,但遺憾的是沒有辦法提供start說法,效果是:

cut(v,"15 min") 
# [1] 2010-01-13 03:02:00 2010-01-13 03:02:00 2010-01-13 03:02:00 
# [4] 2010-01-13 03:17:00 2010-01-13 03:17:00 
# Levels: 2010-01-13 03:02:00 2010-01-13 03:17:00 

正如您所看到的,它始於03:02:00。您可能會混淆輸出因子的標籤(將標籤轉換爲時間,以某種方式將其轉換回來並轉換爲字符)。

+0

謝謝,這看起來像它會讓我在駭人聽聞的路上走得更遠一點簡單的ts聚合。我仍然保持這種狀態,因爲我認爲我們已經接近使用具有不規則,可能不是唯一時間戳的'xts'的好解決方案。 – mattrepl 2010-03-14 17:14:42

6

使用time series package.的XTS包已專門設計的功能做到這一點。或者查看動物園包中的聚合函數和rollapply函數。

的rmetrics電子書有一個有用的討論,包括各種包的性能比較:https://www.rmetrics.org/files/freepdf/TimeSeriesFAQ.pdf

編輯:看my answer to this question。基本上,您需要將每個時間戳截斷爲特定的時間間隔,然後使用這些新的截斷時間戳作爲分組向量進行聚合。

+0

這看起來很有前途,謝謝!我可能並不清楚,儘管每行都有時間戳,但應該落在相同間隔內的所有行將具有不同的確切時間。例如,只有幾分鐘不同的兩個時間戳應該屬於相同的15分鐘時間間隔。 我更新了一些示例數據的問題。 – mattrepl 2010-03-14 05:23:17

+0

@mattrepl:從「動物園」包裝及其短片開始 - 正如肖恩所說,這些都是爲了這個任務。 – 2010-03-14 12:44:00

+0

我正在嘗試使用'xts'。我注意到數據中有一些重複的時間戳(事件同時發生),但我讀過xt和動物園應該能夠處理時間序列常見問題電子書中的時間戳。 目前,當嘗試使用'xts'創建時間序列對象時出現錯誤:「order.by需要適當的基於時間的對象」。我試過POSIXct,timeDate等等,例如,使用POSIXct時間戳向量會給我那個錯誤。有什麼想法嗎?如果問題不明顯,我可以提供一個小測試用例。 – mattrepl 2010-03-14 17:12:04

0

這是一個有趣的問題;隨着各種時間序列數據包和方法的擴散,應該有一種方法來處理不規則時間序列,而不是OP所建議的暴力破解。這裏有一個「高級別」的方法來獲取可用於aggregate等的間隔,使用爲chron對象定義的版本cut

require(chron) 
require(timeSeries) 

my.times <- " 
2010-01-13 03:02:38 UTC 
2010-01-13 03:08:14 UTC 
2010-01-13 03:14:52 UTC 
2010-01-13 03:20:42 UTC 
2010-01-13 03:22:19 UTC 
" 

time.df <- read.delim(textConnection(my.times),header=FALSE,sep="\n",strip.white=FALSE) 
time.seq <- seq(trunc(timeDate(time.df[1,1]),units="hours"),by=15*60,length=nrow(time.df)) 
intervals <- as.numeric(cut(as.chron(as.character(time.df$V1)),breaks=as.chron(as.character(time.seq)))) 

你得到

intervals 
[1] 1 1 1 2 2 

,你現在可以附加到數據幀和彙總。

上面的雜技雜技(從角色到時間日期到角色到時間)有點不幸,所以如果有更清晰的解決方案來處理使用xt或任何其他timeSeries軟件包的不規則時間數據,我很樂意聽到關於他們以及!

我也很好奇,知道什麼是最有效的方法分級大型高頻率不規則時間序列,例如創建一個非常流動的股票在滴答數據上創建1分鐘的體積條。

相關問題