我有一个单元格数组应该包含从&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'}
谢谢!
答案 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)
以下是一些简单的步骤来实现您的需求:
ismember
查看哪些内容可以在实际列表中找到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));