データ フレーム内のタイムスタンプ付き行から間隔を分割および集計する効率的な方法は何ですか?
質問
タイムスタンプ付きの行 (strptime 結果) を含むデータ フレームから、間隔の統計を集計するための最良の方法は何ですか?
間隔は 1 時間、1 日などです。
そこにあるのは、 aggregate
関数ですが、それは各行を間隔に割り当てるのには役に立ちません。間隔を示す列をデータフレームに追加し、それを使用することを計画しています aggregate
, 、しかし、より良い解決策があれば、それを聞くのは素晴らしいことです。
ご指摘ありがとうございます。
データ例
03:00 から始まる 15 分間隔に分割されたタイムスタンプを含む 5 行。
インターバル1
- 「2010-01-13 03:02:38 UTC」
- 「2010-01-13 03:08:14 UTC」
- 「2010-01-13 03:14:52 UTC」
インターバル2
- 「2010-01-13 03:20:42 UTC」
- 「2010-01-13 03:22:19 UTC」
結論
次のような時系列パッケージを使用する xts
それが解決策となるはずです。しかし、私はそれらを使用しても成功しなかったので、結局使用しました cut
. 。現在は間隔ごとに行をグループ化してヒストグラムをプロットするだけなので、これで十分でした。
cut
好んで使われます:
interv <- function(x, start, period, num.intervals) {
return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
解決
ベクトルを分割するための標準的な機能はcut
とfindInterval
ある
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
あなたはそれが午前3時02分00秒で起動します見ての通り。あなたは出力因子のラベルと混乱が(ラウンド何とか時間にラベルを変換して文字に戻って変換する)可能性があります。
他のヒント
時系列パッケージを使用してください。にXTSパッケージが機能を持っていますそれを行うために特別に設計されています。または動物園のパッケージに集約し、rollapply機能を見てください。
rmetrics電子ブックは、様々なパッケージの性能比較を含め、有益な議論があります。 https://www.rmetrics.org/files/freepdf/TimeSeriesFAQ.pdfする
の編集の<のhref = "https://stackoverflow.com/questions/2134972/r-how-to-split-a-chron-date-time-object-inを見てください-zoo-のための集約/ 2135272#2135272" >この質問のに私の答え。基本的には、特定の期間に、すべてのタイムスタンプを切り捨てた後、あなたのグループ化ベクトルとしてそれらの新しい切り捨てられたタイムスタンプを使用して集約を行う必要があります。
これは興味深い質問です。様々な時系列パッケージおよび方法の普及に伴い、そこには、OPが示唆ブルートフォースによる以外の不規則な時間系列をビニングするためのアプローチであるべきです。ここでは、その後、aggregate
オブジェクトのために定義されcut
のバージョンを使用して、chron
らのために使用することができます間隔を取得するための一つの「ハイレベル」方法です。
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
あなたは今、データフレームと集計に追加することができます。
coersionアクロバット(文字からTIMEDATEにCHRONへ文字まで)上記少し残念なので、クリーンなソリューションはXTSまたは他の時系列パッケージのいずれかを使用して不規則な時間データをビニングするために存在する場合、私は約聞いてみたいです彼らにも!..
私はまた、例えば、大規模な高周波不規則時系列をビニングするための最も効率的なアプローチであるものを知って好奇心非常に液体の株式のための目盛りのデータの1分のボリュームバーを作成します。