检查分钟的顺序matlab

时间:2014-08-28 07:50:57

标签: matlab sequence

我有一个单元格数组应该包含从&00:00:00:00'至' 59:00'分辨率为1分钟:

time={'00:00:00'
'00:01:00'
'00:02:00'
'00:03:00'
'00:04:00'
'00:05:00'
'00:06:00'
'00:07:00'
'23:59:00'}

什么是智能方法来检查单元格数组中是否存在所有分钟'时间'并找出遗失的那些?

使用示例中的向量,我想要一个包含缺少分钟对应的NaN的向量:

missing_time={'00:00:00'
'00:01:00'
'00:02:00'
'00:03:00'
'00:04:00'
'00:05:00'
'00:06:00'
'00:07:00'
NaN
NaN
...
'23:59:00'}

谢谢!

3 个答案:

答案 0 :(得分:2)

您应该转换为这样的序列日期编号格式:

datenum(datevec(time))

但这是天数,所以让我们转换为分钟:

datenum(datevec(time))*24*60

现在diff将给出连续元素之间的分钟数:

diff(datenum(datevec(time)))

对于您的示例数据,这给了我们:

ans =

   1.0000e+00
   1.0000e+00
   1.0000e+00
   1.0000e+00
   1.0000e+00
   1.0000e+00
   1.0000e+00
   1.4320e+03

这意味着前7个元素是正确的,但是你在元素7和8之间错过了1431分钟(即添加1431 NaN s)。因此,让我们简化你的示例数据使用合理的数字,这样你就可以看到一种方法来填写NaN s:

time={'00:00:00'
'00:01:00'
'00:02:00'
'00:04:00'
'00:05:00'
'00:06:00'
'00:10:00'}


I = round(cumsum(diff(datenum(datevec({'00:00:00',time{:}}'))*24*60)))+1           %//'

missing_time = cell(11,1);  %// in your actual solution you would replace 11 with 60*24
missing_time(:) = NaN;
missing_time(I) = {time{:}}'         %//'

missing_time = 
{
  [1,1] = 00:00:00
  [2,1] = 00:01:00
  [3,1] = 00:02:00
  [4,1] = NaN
  [5,1] = 00:04:00
  [6,1] = 00:05:00
  [7,1] = 00:06:00
  [8,1] = NaN
  [9,1] = NaN
  [10,1] = NaN
  [11,1] = 00:10:00
}

答案 1 :(得分:1)

以下是一些简单的步骤来实现您的需求:

  1. 生成所有必需的时间
  2. 使用ismember查看哪些内容可以在实际列表中找到
  3. 将其余部分替换为NaN

答案 2 :(得分:1)

这是一个解决方案,它使用setdiff从给定的时间单元格中查找丢失的时间以及当天的所有时间。

% convert to serial datenum
time_serial = datenum(time, 'HH:MM:ss');
dt = 1/(24*60); % 1 min

% full time (1440x1)
time_full = datenum('00:00:00', 'HH:MM:ss'):dt:datenum('23:59:00', 'HH:MM:ss');

% find missing times and replace with NaN
[~, missing_idx] = setdiff(time_full, time_serial);
time_missing = cellstr(datestr(time_full, 'HH:MM:ss'));
time_missing(missing_idx,:) = cellstr(repmat('NaN',length(missing_idx),1));