2013-12-06 1 views
1

У меня есть почасовые данные, и я хочу найти ежедневное максимальное 8-часовое среднее значение. В принципе, за каждый час дня я хочу сделать 8-часовое среднее. Поэтому возьмите среднее число с 0:00 до 8:00, затем с 1:00 до 9:00 и т. Д.), Поэтому я получаю 24 8-часовых средних периода (некоторые из них работают на следующий день, конечно). Тогда мне нужно взять максимум этих 24 8-часовых средних, чтобы получить максимальный дневной максимум.Ежедневный максимум 8-часовой пробег среднее/скользящее среднее

.mat файл используется, можно найти здесь: https://www.dropbox.com/sh/9e2dgm0imvr0hpe/tAUOtpZEEa

записка о формате файла: The O3.mat файл имеет переменную O3_Sorted, которая является массивом ячеек. Он содержит все данные, уже отсортированные. Но данные содержат информацию из нескольких сайтов (т. Е. Есть информация из разных мест). Информация для каждого сайта сортируется вместе, но в коде, когда я пытаюсь найти 8-часовые средние значения, я должен вытащить один сайт за раз, чтобы средние значения не попадали в начало данных для другое место.

Вот пример того, как выглядят вещи. Я включил один день для одного сайта и полдня другого сайта. Фактический файл имеет месяц данных для каждого из этих сайтов и других сайтов. Как видите, иногда данные отсутствуют. Колонка 1 - имя сайта Колонка 2 - Дата Колонка 3 - Час Колонка 4 - Данные

003-0010 2007-05-31 00:00 0.016 
003-0010 2007-05-31 01:00 0.015 
003-0010 2007-05-31 02:00 0.002 
003-0010 2007-05-31 03:00 0.03 
003-0010 2007-05-31 04:00 0.019 
003-0010 2007-05-31 05:00 0.013 
003-0010 2007-05-31 06:00 0.018 
003-0010 2007-05-31 07:00 0.024 
003-0010 2007-05-31 08:00 0.031 
003-0010 2007-05-31 09:00 0.029 
003-0010 2007-05-31 10:00 0.031 
003-0010 2007-05-31 11:00 0.035 
003-0010 2007-05-31 12:00 0.026 
003-0010 2007-05-31 13:00 0.026 
003-0010 2007-05-31 14:00 0.033 
003-0010 2007-05-31 15:00 0.039 
003-0010 2007-05-31 16:00 0.036 
003-0010 2007-05-31 17:00 0.035 
003-0010 2007-05-31 18:00 0.031 
003-0010 2007-05-31 19:00 0.03 
003-0010 2007-05-31 20:00 0.03 
003-0010 2007-05-31 21:00 0.017 
003-0010 2007-05-31 22:00 0.017 
003-0010 2007-05-31 23:00 0.007 
027-0007 2007-05-31 00:00 0.045 
027-0007 2007-05-31 01:00 0.043 
027-0007 2007-05-31 02:00 
027-0007 2007-05-31 03:00 0.038 
027-0007 2007-05-31 04:00 0.037 
027-0007 2007-05-31 05:00 0.034 
027-0007 2007-05-31 06:00 0.034 
027-0007 2007-05-31 07:00 0.038 
027-0007 2007-05-31 08:00 0.044 
027-0007 2007-05-31 09:00 0.05 
027-0007 2007-05-31 10:00 0.054 
027-0007 2007-05-31 11:00 0.051 
027-0007 2007-05-31 12:00 0.047 

Вот то, что я до сих пор:

for i = 1:size(O3_sites) 
    I = ismember(D(:,6), O3_sites(i)); % Rows were the cell array O3_sorted has data corresponding to a certain site 
    site = D(I,:); 

    %% Convert O3 from ppm to ppb, 1ppm = 1000ppb 
    x = 1000; 
    y = str2double(O3); 
    O3_data = bsxfun(@times,x,y); % ppb  

% Find size of array 
[M, N]= size(O3_data); 

% Create empty array 
O3_MD8 = zeros(N,M-7); % double 

**% Do a loop to calculate the running mean 
for j = 1:M-7 
    A = O3_data(j:j+7); 
    O3_MD8(:,j) = mean(A); 
end** 

% Find max from each 8-hour loop 

end 

После того как я получаю 8-часовой в среднем, как я могу попросить MATLAB найти максимальное значение для каждых 24 средних значений? В основном, получите максимальные среднечасовые значения.

Кроме того, метод, который я пытаюсь сделать сейчас, является немного рискованным, потому что я не использую данные и поэтому, если данные отсутствуют в день, я не буду знать. Но я не знаю, как это учитывать при написании кода.

+0

Можете ли вы отправить образцы только соответствующих данных и соответствующим образом подрезать свой код? Трудно расшифровать то, что фактически представляет собой массив ячеек 23808 x 24. – kkuilla

+0

Я выставил весь код, потому что некоторым людям нравится его запускать. Я помещал звезды вокруг соответствующего раздела. В основном, фактические данные измерений находятся в столбце 17, а название сайта, из которого он пришел, находится в столбце 6.Важной частью является область для цикла, особенно начиная с «Сделайте цикл, чтобы вычислить текущее среднее». Надеюсь, что это полезно – shizishan

+0

Не могли бы вы затем опубликовать десять строк столбца 6 и 17, а затем удалить любой код за пределами звезд, пожалуйста? Все остальное не имеет отношения к вопросу, который вы задаете. Вы должны облегчить людям понимание и запуск, если вы хотите получить ответы. – kkuilla

ответ

2

Вы могли бы просто использовать функцию filter, хотя я предполагаю, что вы уже получили ваши данные в нужном формате (1D-вектор)

hours = 8; % size of hour window defining the moving average 
movAV = filter(ones(1,hours)/hours,1,O3_data); 

Для дневного максимума вам нужно разделить свой «час» -векторный и movAV в круглых скобках. Если у вас есть одно значение за час вы можете просто перекроить свой результат в 24 x N массива:

%example 
x = 1:240; %d ata for 10 days 
y = reshape(x,24,[]) 

затем использовать дополнительные параметры максимальной функции для поиска максимального по столбцам:

% in this case the max is always the last value of every day 
dailyMax = max(y,[],1) 

dailyMax = 

    24 48 72 96 120 144 168 192 216 240 

соответственно:

dailyMax = max(reshape(movAV,24,[]),[],1) 

Возможно, для вашего случая самый удобный woul d использовать findpeaks, который будет напрямую выводить все локальные максимумы (требуется Инструмент обработки сигналов).

+0

Спасибо. Я не знал, как использовать фильтр, и у меня возникли проблемы с пониманием документации. Но функция max просто находит максимум всего массива. он может найти максимум каждые 24 элемента.Как я могу это сделать? – shizishan

+0

Есть ли способ сделать фильтр с использованием данных, чтобы он читал через каждые 8 ​​часов вместо обычных 8 записей? – shizishan

+0

@shizishan для первого комментария: посмотрите в моем редактировании. Что касается вашего второго комментария: я не очень хорошо знаком с форматом данных, я его никогда не использовал, поэтому я не могу ответить на это. – thewaywewalk