2

だから、私はMATLABで時系列を使い始めていますが、ちょっと行き詰まっています。

MATLAB にインポートしたイベントのタイムスタンプのリストがあります。次のような 3000x25 の配列になりました。

2000-01-01T00:01:01+00:00
2000-01-01T00:01:02+00:00
2000-01-01T00:01:03+00:00
2000-01-01T00:01:04+00:00

ご覧のとおり、各イベントは日付、時間、分、秒などで記録されています。

ここで、日付、時間などでイベントの数を数え、さまざまな分析 (回帰など) を行いたいと考えています。

日ごとに timeseries オブジェクトを作成することも検討しましたが、データのサイズを考慮すると実用的ではありません。

「日付: イベント数」になるようにこの配列を操作する方法はありますか?
おそらく、時系列を使用してイベントをカウントする簡単な方法がありますか?

4

3 に答える 3

2

他のが示唆しているように、文字列の日付をシリアルの日付番号に変換する必要があります。これにより、数値データの操作が容易になります。

間隔 (日、時間、分など) ごとのイベント数をカウントする効率的な方法は、HISTCACCUMARRAYなどの関数を使用することです。このプロセスでは、シリアル日付をそのような関数で必要な単位/形式に操作する必要があります (たとえば、ACCUMARRAY には整数が必要ですが、HISTC には範囲を指定するためにビンのエッジを指定する必要があります)。

以下は、ACCUMARRAY を使用してイベント数をカウントするベクトル化されたソリューション (ループなし) です。これは非常に効率的な関数です (入力が大きい場合でも)。最初に、4 日間にわたって不等間隔に配置された 5000 個のタイムスタンプのサンプル データを生成します。あなたは明らかにそれをあなた自身のものに置き換えたいと思っています:

%# lets generate some random timestamp between two points (unevenly spaced)
%# 1000 timestamps over a period of 4 days
dStart = datenum('2000-01-01');     % inclusive
dEnd = datenum('2000-01-5');        % exclusive
t = sort(dStart + (dEnd-dStart).*rand(5000,1));
%#disp( datestr(t) )

%# shift values, by using dStart as reference point
dRange = (dEnd-dStart);
tt = t - dStart;

%# number of events by day/hour/minute
numEventsDays = accumarray(fix(tt)+1, 1, [dRange*1 1]);
numEventsHours = accumarray(fix(tt*24)+1, 1, [dRange*24 1]);
numEventsMinutes = accumarray(fix(tt*24*60)+1, 1, [dRange*24*60 1]);

%# corresponding datetime range/interval label
days = cellstr(datestr(dStart:1:dEnd-1));
hours = cellstr(datestr(dStart:1/24:dEnd-1/24));
minutes = cellstr(datestr(dStart:1/24/60:dEnd-1/24/60));

%# display results
[days num2cell(numEventsDays)]
[hours num2cell(numEventsHours)]
[minutes num2cell(numEventsMinutes)]

1 日あたりのイベント数の出力は次のとおりです。

'01-Jan-2000'    [1271]
'02-Jan-2000'    [1258]
'03-Jan-2000'    [1243]
'04-Jan-2000'    [1228]

1 時間あたりのイベント数の抜粋:

'02-Jan-2000 09:00:00'    [50]
'02-Jan-2000 10:00:00'    [54]
'02-Jan-2000 11:00:00'    [53]
'02-Jan-2000 12:00:00'    [74]
'02-Jan-2000 13:00:00'    [49]
'02-Jan-2000 14:00:00'    [59]

同様に数分間:

'03-Jan-2000 08:54:00'    [1]
'03-Jan-2000 08:55:00'    [1]
'03-Jan-2000 08:56:00'    [1]
'03-Jan-2000 08:57:00'    [0]
'03-Jan-2000 08:58:00'    [0]
'03-Jan-2000 08:59:00'    [0]
'03-Jan-2000 09:00:00'    [1]
'03-Jan-2000 09:01:00'    [2]
于 2012-07-27T00:43:50.243 に答える
1

これらのタイムスタンプをdatenumの数値に変換できます。

シリアル日付番号は、特定の日時からの日数の全体と小数を表します。ここで、datenum('Jan-1-0000 00:00:00')は数値1を返します(0000年は単なる参照ポイントであり、実年として解釈されることを意図したものではありません。)

これにより、期間の開始位置と終了位置を簡単に確認できます。例:探している週はxで始まり、x+7.999で終わります...; その期間のイベントを見つけるために必要なのは、datenum値がxとx+8の間にあるかどうかを確認することだけです。

week_x_events = find(dn_timestamp>=x & dn_timestamp<x+8)

難しいのは、タイムスタンプをdatenumで受け入れ可能な形式に変換することです。これは、正規表現を使用して実行できます。幸運を祈ります。

于 2012-07-26T14:47:00.450 に答える
0

I don't know what +00:00 means (maybe time zone?), but you can simply convert your string timestamps into numerical format:

>> t = datenum('2000-01-01T00:01:04+00:00', 'yyyy-mm-ddTHH:MM:SS')

t =

  7.3049e+005

>> datestr(t)

ans =

01-Jan-2000 00:01:04
于 2012-07-26T19:13:59.333 に答える