-->

计数按天/小时值与MATLAB时间序列(Counting values by day/hour wi

2019-06-26 13:30发布

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

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

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

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

有什么办法来处理这个阵列,使得我们有“日期:#事件”?
或许有只是一个计算使用时间序列事件更简单的方法?

Answer 1:

至于其他建议,应该将字符串日期转换成串行日期数字。 这可以很容易地用数字的数据。

一种有效的方法来计算每间隔事件(天,小时,分钟等)的数量是使用功能,如HISTC和ACCUMARRAY 。 该过程将涉及操纵串行日期,由这些功能所需要的单元/格式(例如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]


Answer 2:

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

日期以一串数字代表从一个特定的日期和时间,其中datenum(“扬-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可接受的格式,这是可行的使用正则表达式 ,祝你好运!



Answer 3:

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


文章来源: Counting values by day/hour with timeseries in MATLAB