Сравнение дат и заполнение времен разрыва в Matlab - PullRequest
0 голосов
/ 09 марта 2011

У меня есть файл данных, который содержит данные времени. Список довольно длинный, более 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 для данных, связанных с метками времени, поэтому я хочу, чтобы как можно больше унифицированных данных (данные, связанные с отсутствующими интервалами, будут интерполированы). Я подумал о том, чтобы разбить его на более мелкие куски времени и просто проверять маленькие порции по одному, но я не знаю, является ли это лучшим способом сделать это. Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Так как вы озабочены отсутствием записей данных, а не другими проблемами синхронизации, такими как дрейфующий временной канал, вы можете проверить пропущенные записи, преобразовав значения времени в секунды, выполнив 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
0 голосов
/ 09 марта 2011

Умножьте свои числа секунд на 10 и округлите до ближайшего целого числа, прежде чем сравнивать с вашим диапазоном.

Могут быть более эффективные способы сделать это, чем ismember.(Я не знаю, насколько умна реализация ismember, но если это самое простое, что могло бы сработать, тогда вы будете использовать O (N ^ 2) раз таким образом.) Например, вы можете использоватьвременные метки, которые фактически присутствуют (в виде целых чисел с интервалом в 0,1 секунды) в виде индексов в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...