【问题标题】:check sequence of minutes matlab检查分钟序列matlab
【发布时间】:2014-08-28 16:31:16
【问题描述】:

我有一个单元格数组,它应该包含从 '00:00:00' 到 '23: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'}

谢谢!

【问题讨论】:

标签: matlab sequence


【解决方案1】:

您应该像这样转换为序列日期数字格式:

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 NaNs)。所以让我们简化您的示例数据以使用合理的数字,这样您就可以查看填写NaNs 的一种方法:

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
}

【讨论】:

  • 我想您可能想使用cumsum 左右来实际获取相关值的索引。
  • @DennisJaheruddin 完全正确
  • @gabboshow 我认为NaN 周围不需要大括号,但我只在 Octave 中在线测试过,所以 Matlab 可能会略有不同。
【解决方案2】:

这里有一个解决方案,它使用 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));

【讨论】:

    【解决方案3】:

    这里有一些简单的步骤来实现你所需要的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多