3

タイムスタンプ付き (2 番目まで) の時系列で構成される動物園オブジェクトがあります。時系列は、値間の時間間隔が一定でないという点で不規則です。

不規則な間隔の timeseries オブジェクトを規則的な間隔のオブジェクトに変換したいと思います。値間の時間間隔は一定で、たとえば 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

与えられた例では、私のカスタム集計関数は、集計する「選択された行」の「セット」の最初の値を返すだけです。

4

4 に答える 4

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 
于 2012-02-06T01:53:22.843 に答える
2

これがzooまたは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 
于 2012-02-05T21:48:57.603 に答える
1

私は単にあなたの間隔に向かって時間を切り捨てるので、それtが時間であると仮定します(そうでない場合は使用してくださいas.POSIXct

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

bucket次に、のように集計できますaggregate(value, list(bucket), sum)

(私は使用しないzooので、これは純粋なRです)

于 2012-02-05T21:41:23.847 に答える
0

You should look at align.time in xts. It does something very close to what you want to achieve.

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

You can lag the time series by 30 seconds if it makes the interpretation clearer.

于 2012-02-05T21:47:16.230 に答える