所以,我开始在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
如您所见,每个事件都按日期,小时,分钟,秒等记录。
现在,我想按日期,小时等计算事件数量,然后进行各种分析(回归等)。
我考虑过为每一天创建一个时间序列对象,但考虑到数据的大小,这是不切实际的。
有没有办法操纵这个数组,以便我们有“日期:事件数量”?
也许只有一种更简单的方法来计算使用时间序列的事件?
答案 0 :(得分:2)
正如others建议的那样,您应该将字符串日期转换为序列日期编号。这样可以轻松处理数字数据。
计算每个时间间隔(天,小时,分钟等)事件数量的有效方法是使用HISTC和ACCUMARRAY等函数。该过程将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