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



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

正如你所看到的,每个事件都是按日期、小时、分钟、秒等记录的。

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

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

有没有任何方法可以操作这个数组,使我们有"date:#of events"
也许有一种更简单的方法可以使用时间序列来计数事件

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

计算每个间隔(天、小时、分钟等)事件数的一种有效方法是使用HISTC和ACCUMARRAY等函数。该过程将涉及将串行日期操作为此类函数所需的单位/格式(例如,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)]

以下是每天事件数的输出:

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

您可以将这些时间戳转换为具有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是可行的,祝你好运!

我不知道+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

最新更新