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

如您所见,每个事件都按日期、小时、分钟、秒等记录。

现在,我想按日期、小时等计算事件的数量,然后进行各种分析(回归等)。

我考虑为每天创建一个时间序列对象,但考虑到数据的大小,这是不切实际的。

有没有办法操纵这个数组,使我们有“日期:事件的数量”?
也许只有一种更简单的方法来使用时间序列来计算事件?

4

3 回答 3

2

正如其他人所建议的,您应该将字符串日期转换为日期序列号。这使得使用数字数据变得容易。

计算每个间隔(天、小时、分钟等)的事件数的一种有效方法是使用HISTCACCUMARRAY等函数。该过程将涉及将序列日期操作为此类函数所需的单位/格式(例如,ACCUMARRAY 需要整数,而 HISTC 需要被赋予 bin 边缘以指定范围)。

这是一个矢量化解决方案(无循环),它使用 ACCUMARRAY 来计算事件数。这是一个非常有效的功能(即使输入很大)。一开始,我生成了一些 5000 个时间戳的样本数据,这些时间戳在 4 天的时间内不均匀分布。您显然想用自己的替换它:

%# 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)]

这是每天事件数的输出:

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

以及每小时事件数量的摘录:

'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 可接受的格式,这可以使用regexp来实现,祝你好运!

于 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 回答