MATLAB, фильтр соответствия времени - PullRequest
0 голосов
/ 14 февраля 2010

ОК, я все еще изучаю MATLAB . У меня есть два файла в другом формате. Один файл Excel. data1.xls, размер = 86400 X 62. Похоже:

Date/Time par1 par2 par3 par4 par5 par6 par6 par7 par8 par9
08/02/09 00:06:45 0 3 27 9.9 -133.2 0 0 0 1 0

Другой файл, data2.csv, размер = 144 X 27. (Если ничего не пропало.)

Похоже:

date time  P01 P02 P03 P04 P05  P06  P07 P08 P09  P10  P11
8/16/2009 0:00  51   45  46    54   53  52 524  5  399      89      78

Теперь я использую

Data10minAvg = mean(reshape(Data,300,144,62));

, чтобы получить среднее значение за 10 минут первого файла Excel. Теперь мне нужно сопоставить этот файл, который я делаю выше, с файлом .csv. Проблема в том, что многие временные метки отсутствуют в файле .csv.

Как превратить data2.csv в файл размером 144 X 27, заменив отсутствующие метки даты на строки с нулями?

Это мне действительно поможет, чем сравнить файл data1.xls с newdata2.csv.

Update

Привет. Это Пол. Большое спасибо геодезические. Я не знаю, как редактировать, чтобы я не мог написать все мои файлы. Вы прекрасно поняли вопрос.

Но теперь, когда я запускаю ваш код, он генерирует файл длиной 377 X 11, когда я использую timediff (i)> 10, так как я хочу 10-минутные интервалы, поэтому у меня не должно быть больше 144 в качестве длины моего файла. Ваш код довольно сложен для меня, я использовал

fid = fopen('data2.csv', 'rt');

topLine = fgets(fid);

data = textscan(fid, '%s %f %f %f %f %f%f%f %f %f %f %f%f%f %f %f %f %f%f%f %f %f %f %f%f%f %f %f ' ,.... 'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);

fclose(fid);

p= [datenum(data{1}) data{2}];

for n=1:127 % this file was of length 127

s=datevec(p(n,1)); Hour= s(1,4) min=s(1,5)

nTime(n,:)=60*Hour+min; end

чтобы узнать время

Можете ли вы помочь мне понять ваш последний цикл for, чтобы я мог его использовать.

мой конечный файл должен иметь длину 144 X 11 (столбцы могут быть разными, но я могу это изменить), но строки должны иметь размер 144

** Только что попробовал использовать ваш код timeDiff = round (diff (datenum (time) * 24 * 6)); это дало мне 143 строки, намного ближе к тому, что я хочу. **

также все остальные значения округляются, чтобы остановить его?

Спасибо за тонну.

1 Ответ

1 голос
/ 15 февраля 2010

Из вашего ответа, с какой-то поэтической лицензией, похоже, что вы используете текстовое сканирование со строкой %s %u %u %u %u %u %u %u %u %u %u %u для чтения в файле.Я создал файл с несколькими случайными числами, пытаясь эмулировать ситуацию:

date time, P01,P02, P03, P04, P05, P06, P07, P08, P09, P10, P11
8/16/2009 0:00,51,45,46,54,53,52,524,5,399,89,78
8/16/2009 0:01,11,73,65,67,10,32,100,64,167,87,48
8/16/2009 0:02,20,58,89,15,30,67,113,76,409,55,26
8/16/2009 0:03,89,33,33,58,90,61,545,51,88,23,34
8/16/2009 0:04,33,9,92,43,86,97,345,20,369,38,29
8/16/2009 0:06,24,86,74,38,38,90,16,48,197,34,75
8/16/2009 0:07,59,86,67,30,7,54,135,8,231,66,19
8/16/2009 0:08,47,11,74,30,30,60,302,49,200,59,40
8/16/2009 0:09,76,50,66,48,92,2,598,83,336,26,34
8/16/2009 0:10,97,12,38,62,54,63,437,32,480,85,53
8/16/2009 0:11,30,78,6,98,98,21,375,50,72,87,15
8/16/2009 0:12,3,63,2,30,14,7,436,100,406,9,55
8/16/2009 0:13,43,19,32,8,31,20,426,29,296,97,50
8/16/2009 0:16,83,1,75,66,43,43,356,40,496,86,68
8/16/2009 0:17,24,69,67,40,81,23,526,36,104,73,10
8/16/2009 0:18,47,28,37,97,31,19,546,73,381,87,8
8/16/2009 0:19,73,38,92,81,21,63,227,50,463,91,74
8/16/2009 0:20,20,56,12,76,79,67,358,47,234,89,57

Это похоже на то, что у вас есть?Весь ряд (0:05, 0:14, 0:15) отсутствует?Тогда что вы хотите сделать, это заполнить пропущенные строки нулями, где ваши данные должны быть такими:

date time, P01,P02, P03, P04, P05, P06, P07, P08, P09, P10, P11
8/16/2009 0:00,51,45,46,54,53,52,524,5,399,89,78
8/16/2009 0:01,11,73,65,67,10,32,100,64,167,87,48
8/16/2009 0:02,20,58,89,15,30,67,113,76,409,55,26
8/16/2009 0:03,89,33,33,58,90,61,545,51,88,23,34
8/16/2009 0:04,33,9,92,43,86,97,345,20,369,38,29
0,0,0,0,0,0,0,0,0,0,0,0
8/16/2009 0:06,24,86,74,38,38,90,16,48,197,34,75
8/16/2009 0:07,59,86,67,30,7,54,135,8,231,66,19
8/16/2009 0:08,47,11,74,30,30,60,302,49,200,59,40
8/16/2009 0:09,76,50,66,48,92,2,598,83,336,26,34
8/16/2009 0:10,97,12,38,62,54,63,437,32,480,85,53
8/16/2009 0:11,30,78,6,98,98,21,375,50,72,87,15
8/16/2009 0:12,3,63,2,30,14,7,436,100,406,9,55
8/16/2009 0:13,43,19,32,8,31,20,426,29,296,97,50
0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0
8/16/2009 0:16,83,1,75,66,43,43,356,40,496,86,68
8/16/2009 0:17,24,69,67,40,81,23,526,36,104,73,10
8/16/2009 0:18,47,28,37,97,31,19,546,73,381,87,8
8/16/2009 0:19,73,38,92,81,21,63,227,50,463,91,74
8/16/2009 0:20,20,56,12,76,79,67,358,47,234,89,57

Мое предположение в этом решении состоит в том, что файл должен быть суммой разности между каждым разом.шаг, который позволяет вам файлы, которые не всегда будут иметь статический размер (т. е. 144).Я вытянул время для вектора и сделал остальные данные матрицей, а не ячейкой, но, как вы можете видеть, это было бы легко исправить с помощью решения для ячейки:

fid = fopen('data2.csv', 'rt');
data = textscan(fid, ['%s' repmat('%u',1,11)], 'HeaderLines', 1, 'Delimiter', ',');
fclose(fid);

%//Make time a datenum of the first column
time = datenum(data{1}, 'mm/dd/yyyy HH:MM');
%//Find the difference in minutes from each row
timeDiff = round(diff(datenum(time))*24*60);

%//the rest of the data
data = cell2mat(data(2:12));


for i=1:length(timeDiff)
    if timeDiff(i) > 1
        %//there's are missing rows, make a gap
        data = [data(1:i,:); repmat(0,timeDiff(i)-1,11);data(i+1:end,:)];
    end
end
* 1010И, наконец, вывод:
data =

          51          45          46          54          53          52         524           5         399          89          78
          11          73          65          67          10          32         100          64         167          87          48
          20          58          89          15          30          67         113          76         409          55          26
          89          33          33          58          90          61         545          51          88          23          34
          33           9          92          43          86          97         345          20         369          38          29
           0           0           0           0           0           0           0           0           0           0           0
          24          86          74          38          38          90          16          48         197          34          75
          59          86          67          30           7          54         135           8         231          66          19
          47          11          74          30          30          60         302          49         200          59          40
          76          50          66          48          92           2         598          83         336          26          34
          97          12          38          62          54          63         437          32         480          85          53
          30          78           6          98          98          21         375          50          72          87          15
           3          63           2          30          14           7         436         100         406           9          55
           0           0           0           0           0           0           0           0           0           0           0
           0           0           0           0           0           0           0           0           0           0           0
          43          19          32           8          31          20         426          29         296          97          50
          83           1          75          66          43          43         356          40         496          86          68
          24          69          67          40          81          23         526          36         104          73          10
          47          28          37          97          31          19         546          73         381          87           8
          73          38          92          81          21          63         227          50         463          91          74
          20          56          12          76          79          67         358          47         234          89          57
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...