5

タイムスタンプ付きの行(strptimeの結果)を持つデータフレームから、間隔の統計を集計するための最良の方法は何ですか?

間隔は、1時間、1日などです。

関数はありaggregateますが、それは各行を間隔に割り当てるのに役立ちません。間隔を示す列をデータフレームに追加し、それをで使用することを計画していますがaggregate、より良い解決策があれば、それを聞くのは素晴らしいことです。

ポインタをありがとう!


サンプルデータ

タイムスタンプが03:00から15分間隔に分割された5行。

インターバル1

  • 「2010-01-1303:02:38UTC」
  • 「2010-01-1303:08:14UTC」
  • 「2010-01-1303:14:52UTC」

インターバル2

  • 「2010-01-1303:20:42UTC」
  • 「2010-01-1303:22:19UTC」

結論

xts解決策となるはずのような時系列パッケージを使用する。しかし、私はそれらを使用することに成功せず、を使用することになりましたcut。現在、行を間隔でグループ化してヒストグラムをプロットするだけでよいので、これで十分でした。

cutのように使用されます:

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

3 に答える 3

6

時系列パッケージを使用します。xtsパッケージには、それを行うために特別に設計された関数があります。または、zooパッケージのaggregate関数とrollapply関数を確認してください。

rmetrics ebookには、さまざまなパッケージのパフォーマンス比較など、役立つディスカッションがあります 。https ://www.rmetrics.org/files/freepdf/TimeSeriesFAQ.pdf

編集この質問に対する私の答えを見てください。基本的に、すべてのタイムスタンプを特定の間隔に切り捨ててから、それらの新しい切り捨てられたタイムスタンプをグループ化ベクトルとして使用して集計を行う必要があります。

于 2010-03-14T04:45:14.270 に答える
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に開始します。出力係数のラベルをいじることができます(ラベルを時間に変換し、何らかの方法で丸めて、文字に戻す)。

于 2010-03-14T11:12:29.397 に答える
0

これは興味深い質問です。さまざまな時系列パッケージと方法の急増に伴い、OPが提案するブルートフォース以外の方法で、不規則な時系列をビニングするアプローチが必要になります。これは、オブジェクトに定義されaggregateたバージョンを使用して、他に使用できる間隔を取得するための「高レベル」の方法の1つです。cutchron

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

これで、データフレームに追加して集計できます。

上記の強制アクロバット(文字からtimeDate、文字からchron)は少し残念です。したがって、xtsまたはその他のtimeSeriesパッケージを使用して不規則な時間データをビニングするためのよりクリーンなソリューションがある場合は、それらについても聞いてみたいと思います。 !..

また、非常に流動性の高い株のティックデータに1分のボリュームバーを作成するなど、大きな高周波の不規則な時系列をビニングするための最も効率的なアプローチが何であるかを知りたいと思います。

于 2010-03-14T07:30:19.120 に答える