Matlab 检查会议记录的顺序
我有一个单元格数组,它应该包含从“00:00:00”到“23:59:00”的时间,分辨率为1分钟:Matlab 检查会议记录的顺序,matlab,sequence,Matlab,Sequence,我有一个单元格数组,它应该包含从“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'
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'}
谢谢 您应该转换为如下序列日期编号格式:
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分钟(即添加1431NaN
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
}
您应该转换为如下所示的序列日期编号格式:
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分钟(即添加1431NaN
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
}
以下是实现您所需的一些简单步骤:
ismember
查看在实际列表中可以找到它们中的哪一个NaN
以下是实现您所需的一些简单步骤:
ismember
查看在实际列表中可以找到它们中的哪一个NaN
这里有一个解决方案,它使用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));
这里有一个解决方案,它使用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));
最简单的方法,以找出是否有一个失踪。检查元素数:
numel(time)
如果元素数小于60*24,则缺少元素:恐惧这是查找是否缺少元素的最简单方法。检查元素的数量:numel(time)
如果小于60*24,则缺少元素:担心这一点:我想你应该使用cumsum
或其他方法来实际获取相关值的索引。@DennisJaheruddinexactly@gabboshow我认为在NaN
周围不需要大括号,但是我只在线测试了八度音阶,所以Matlab可能会有点不同。我想你可能会想使用cumsum
或者其他方法来实际获得相关值的索引。@DennisJaheruddinexactly@gabboshow我认为在NaN
周围不需要大括号,但我只在网上测试了八度音阶,所以Matlab可能会略有不同。