2013-07-24 2 views
2

Я обрабатываю временные метки 1 Гц (переменный «timestamp_1hz») из регистратора, который не регистрируется ровно в одно и то же время каждую секунду (разница варьируется от 0.984 до 1.094, но иногда 0,5 или несколько секунд, если логгер отрывается). Набор данных 1 Гц используется для создания 10-минутного усредненного набора данных, и каждый 10-минутный интервал должен иметь 600 записей. Поскольку регистратор не регистрируется ровно в одно и то же время каждую секунду, метка времени медленно перемещается по отметке 1 секунда. Проблемы возникают, когда метка времени пересекает отметку 0, а также отметку 0,5.Обработка временной метки Мозговой инструмент

Я пробовал различные способы предварительной обработки временных меток. Временные метки с интервалом около 1 секунды должны считаться действительными. Несколько примеров:

% simple 
% this screws up around half second and full second values  
rawseconds = raw_1hz_new(:,6)+(raw_1hz_new(:,7)./1000); 
rawsecondstest = rawseconds; 
    rawsecondstest(:,1) = floor(rawseconds(:,1))+ rawseconds(1,1); 

% more complicated 
% this screws up if there is missing data, then the issue compounds because k+1 timestamp is dependent on k timestamp 
rawseconds = raw_1hz_new(:,6)+(raw_1hz_new(:,7)./1000); 
A = diff(rawseconds); 
    numcheck = rawseconds(1,1); 
    integ = floor(numcheck); 
    fract = numcheck-integ; 
    if fract>0.5 
     rawseconds(1,1) = rawseconds(1,1)-0.5; 
    end 
for k=2:length(rawseconds) 
     rawsecondstest(k,1) = rawsecondstest(k-1,1)+round(A(k-1,1)); 
end 

Я хотел бы предварительно обработать метки времени, а затем сравнить его с прилежащей 1Гц метку времени с использованием «пересекаются», чтобы найти недостающие, повторяющиеся и т.д. данные, такие как это:

% pull out the time stamp (round to 1hz and convert to serial number) 
timestamp_1hz=round((datenum(raw_1hz_new(:,[1:6])))*86400)/86400; 

% calculate new start time and end time to find contig time 
starttime=min(timestamp_1hz); 
endtime=max(timestamp_1hz); 

% determine the contig time 
contigtime=round([floor(mean([starttime endtime])):1/86400:ceil(mean([starttime endtime]))-1/86400]'*86400)/86400; 
% find indices where logger time stamp matches real time and puts 
% the indices of a and b 
clear Ia Ib Ic Id 
[~,Ia,Ib]=intersect(timestamp_1hz,contigtime); 
% find indices where there is a value in real time that is not in 
% logger time 
[~,Ic] = setdiff(contigtime,timestamp_1hz); 
% finds the indices that are unique 
[~,Id] = unique(timestamp_1hz); 

Вы можете загрузить 10 дней с raw_1hz_new временных меток here. Любая помощь или советы будут высоко оценены!

+1

Если вы не можете записать 600 записей, не считаете ли вы, что недостающие данные немного неискренны. Если вы не возражаете против поддельных данных, чем предварительно обрабатываете данные, которые у вас есть (<600), и используйте среднее значение для заполнения ваших поддельных данных. –

+0

Я не притворяюсь, я просто натыкаюсь на достоверные данные примерно через 1 секунду между интервалами, чтобы он работал с функцией пересечения. Я не заинтересован в заполнении отверстий. – user1854628

+0

Я не могу просмотреть ссылку с отметками времени; он говорит: «К сожалению, в настоящее время мы не можем создать представление документа. Повторите попытку позже». – Suedocode

ответ

0

Проблема заключается в том, что вы не можете просто сопоставлять эти штампы со списком раз, потому что вы могли ожидать набор точек данных в секундах = 1000, 1001, 1002, но если раньше была ошибка вы могли бы иметь вполне законные данные на 1000.5, 1001.5, 1002.5 вместо этого.

Если все, что вы хотите, это список допустимых раз/их место в вашей серии, почему не только что-то вроде (раз в секундах):

A = diff(times); % difference between times 
n = find(abs(A-1)<0.1) % change 0.1 to whatever your tolerance is 
times2 = times(n+1); 

times2 должен затем быть список всех меток времени где предыдущая временная метка была примерно 1 секунда назад - работает над небольшим набором поддельных данных, которые я построил, не пробовал на вашем. (Для справок в будущем: было бы более полезно предоставить небольшой набор ваших данных, например, всего за несколько минут, который, как вы знаете, содержит промах).

Я бы взял список допустимых временных меток и разделил его на 10-минутные секции для усреднения, подсчитав количество действительных временных меток в каждом разделе. Если он работает, вы должны получить не более 600 - но не намного меньше, если это случается случайным образом.

Смежные вопросы