我有一个包含时间数据的数据文件。这个名单很长,超过100,000点。每0.1秒有一个数据,时间戳是这样的:
'2010-10-10 12:34:56'
'2010-10-10 12:34:56.1'
'2010-10-10 12:34:56.2'
'2010-10-10 12:34:53.3'
等
不一定每0.1秒间隔一次。我需要检查是否缺少0.1秒间隔,然后将此缺失时间插入日期向量中。比较字符串似乎不必要地复杂化。我尝试比较午夜以来的秒数:
date_nums=datevec(time_stamps);
secs_since_midnight=date_nums(:,4)*3600+date_nums(:,5)*60+date_nums(:,6);
comparison_secs=linspace(0,86400,864000);
res=(ismember(comparison_secs,secs_since_midnight)~=1);
但是由于舍入错误,此方法不起作用。从午夜开始的秒数和秒数的空间来比较它从未完全相等(由于十分之一秒的分辨率?)。目的是稍后对与时间戳相关联的数据进行fft,因此我希望尽可能多的统一数据(与缺失间隔相关联的数据将被内插)。我已经考虑过将它阻塞到更小的时间段,只是一次检查一个小块,但我不知道这是不是最好的方法。谢谢!
答案 0 :(得分:0)
将你的秒数乘以10并舍入到最接近的整数,然后再与你的范围进行比较。
可能有比ismember
更有效的方法。 (我不知道ismember
的实现是多么聪明,但如果它是可能工作的最简单的东西,那么你将以这样的方式花费O(N ^ 2)时间。)例如,你可以使用实际存在的时间戳(作为0.1秒间隔的整数)作为数组的索引。
答案 1 :(得分:0)
由于您关注的是丢失数据记录而不是其他计时问题(例如漂移时间通道),您可以通过将时间值转换为秒来检查丢失的记录,执行DIFF并查找这些差异超过一些容忍度。这将告诉您丢失记录应该去的索引。然后由你来做这件事。请记住,如果您要使用此索引列表填补空白,请按降序索引顺序处理列表,因为插入记录将导致索引列表与数据不同步。
>> time_stamps = now:.1/86400:now+1; % Generate test data. >> time_stamps(randi(length(time_stamps), 10, 1)) = []; % Remove 10 random records. >> t = datenum(time_stamps); % Convert to date numbers. >> t = 86400 * t; % Convert to seconds. >> index = find(diff(t) > 1.999 * 0.1)' + 1 % Find missing records. index = 30855 147905 338883 566331 566557 586423 642062 654682 733641 806963