使用MATLAB中的时间序列按天/小时计算值

时间:2012-07-26 14:30:05

标签: matlab datetime time-series intervals date-range

所以,我开始在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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

正如others建议的那样,您应该将字符串日期转换为序列日期编号。这样可以轻松处理数字数据。

计算每个时间间隔(天,小时,分钟等)事件数量的有效方法是使用HISTCACCUMARRAY等函数。该过程将manipulating序列日期转换为此类函数所需的单位/格式(例如,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]

答案 1 :(得分:1)

您可以将这些时间戳转换为datenum的数字:

  

序列日期编号表示特定日期和时间的整数和小数天数,其中datenum('Jan-1-0000 00:00:00')返回数字1.(0000年仅为a参考点并不打算被解释为真实年份。)

这样,更容易检查一段时间的开始和结束位置。例如:您寻找的那一周从x开始,到x + 7.999结束......;要查找该期间内的事件,您需要做的就是检查datenum值是否介于x和x + 8之间:

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

困难在于将时间戳转换为datenum可接受的格式,这可以使用regexp来实现,祝你好运!

答案 2 :(得分:0)

我不知道+00:00的含义(也许是时区?),但您可以简单地将字符串时间戳转换为数字格式:

>> 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