0 votes

MATLAB, filtre de correspondance temporelle

D'accord, j'apprends toujours à utiliser MATLAB. J'ai deux fichiers dans des formats différents. Un fichier Excel. data1.xls, taille = 86400 X 62. Ça ressemble à :

Date/Heure 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

Un autre fichier, data2.csv, taille = 144 X 27. (Si rien ne manque.)

Ça ressemble à :

date heure  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

Maintenant, j'utilise

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

pour obtenir la moyenne de 10 min du premier fichier Excel. Maintenant, je dois associer ce fichier que je suis en train de créer avec le fichier .csv. Le problème est que de nombreux horodatages manquent dans le fichier .csv.

Comment puis-je transformer data2.csv en un fichier de taille 144 X 27, en remplaçant les horodatages manquants par des lignes de zéro ?

Cela m'aidera vraiment à comparer le fichier data1.xls avec newdata2.csv.

Mise à jour

Bonjour, c'est Paul. Merci beaucoup Geodesic. Je ne sais pas comment modifier donc je n'aurais pas pu écrire mes fichiers entiers. Vous avez parfaitement compris la question.

Mais maintenant, quand j'exécute votre code, il génére un fichier de longueur 377 X 11 lorsque j'utilise timediff(i) >10 comme je veux des intervalles de 10 min, donc je ne devrais pas avoir plus de 144 comme longueur de fichier. Votre code est assez compliqué pour moi, j'utilisais

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 % ce fichier était de longueur 127

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

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

pour obtenir mes heures

Pouvez-vous m'aider à comprendre votre dernière boucle for afin que je puisse l'utiliser.

Mon fichier final doit avoir une taille de 144 X 11 (les colonnes varient mais je peux les changer) mais il doit y avoir 144 lignes

**J'ai essayé d'utiliser votre code timeDiff = round(diff(datenum(time)*24*6)); il m'a donné 143 lignes, beaucoup plus proche de ce que je veux. **

et toutes les autres valeurs sont arrondies, y a-t-il un moyen de l'arrêter ?

Merci infiniment.

1voto

George Tian Points 185

À partir de votre réponse, avec un peu de licence poétique, il semble que vous utiliseriez textscan avec la chaîne %s %u %u %u %u %u %u %u %u %u %u %u pour lire le fichier. J'ai créé un fichier avec quelques entiers aléatoires dans une tentative d'imiter la situation :

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

Est-ce similaire à ce que vous avez ? La rangée entière (0:05, 0:14, 0:15) manque ? Alors ce que vous voulez faire est remplir les rangées manquantes avec des 0 là où vos données devraient être, comme ceci :

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

Mon hypothèse dans cette solution est que le fichier devrait être la somme de la différence entre chaque pas de temps, ce qui permet d'avoir des fichiers qui ne seront pas toujours de taille fixe (c'est-à-dire 144). J'ai extrait le temps dans un vecteur et transformé le reste des données en matrice plutôt qu'en cellule, mais comme vous pouvez le voir, il serait tout aussi facile à corriger avec une solution de cellule :

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

%//Faire du temps un datenum de la première colonne
time = datenum(data{1}, 'mm/dd/yyyy HH:MM');
%//Trouver la différence en minutes de chaque ligne
timeDiff = round(diff(datenum(time))*24*60);

%//le reste des données
data = cell2mat(data(2:12));

for i=1:length(timeDiff)
    if timeDiff(i) > 1
        %//il manque des rangées, faire un écart
        data = [data(1:i,:); repmat(0,timeDiff(i)-1,11);data(i+1:end,:)];
    end
end

Et enfin, la sortie :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X