2011-03-08 53 views
0

我有一個包含時間數據的數據文件。名單很長,超過10萬分以上。有每0.1秒內的數據,和所述時間戳是這樣:比較日期和填寫matlab中的缺口時間

'2010-10-10十二時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); 

但是,由於舍入錯誤,此方法不起作用。從午夜開始的秒數和秒數的間隔時間來比較它永遠不會完全相等(由於十分之一秒的分辨率?)。目的是爲了稍後對與時間戳有關的數據做一個簡單的處理,所以我需要儘可能多的統一數據(與缺失間隔相關的數據將被內插)。我已經考慮將它分成更小的時間段,並且一次只檢查一小塊,但我不知道這是否是最好的方法。謝謝!

回答

0

將您的秒數乘以10,然後舍入到最接近的整數,然後再與您的範圍進行比較。

可能有比ismember更有效的方法來做到這一點。 (我不知道ismember的執行是多麼的巧妙,但如果它是最簡單的事情,可能會工作,那麼你將採取O(N^2)的時間。)例如,你可以使用時間戳它們實際存在(作爲0.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