MATLAB,时间匹配过滤器

时间:2010-02-14 01:50:11

标签: matlab

好的,我仍然对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));

获取第一个Excel文件的10分钟平均值。 现在我需要将我上面创建的文件与.csv文件进行匹配。 问题是.csv文件中缺少许多时间戳。

如何将data2.csv放入大小为144 X 27的文件中,用零行替换丢失的日期戳?

将data1.xls文件与newdata2.csv进行比较确实对我有所帮助。

更新

嗨这是保罗。非常感谢Geodesic。我不知道如何编辑所以我无法编写我的整个文件。你完全理解这个问题。

但是现在当我运行你的代码时,它生成一个长度为377×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

得到我的时间

你能帮助我理解你的最后一个循环,所以我可以使用它。

我的最终文件长度必须为144 X 11(列数各不相同,但我可以更改)但行必须为144

**刚试过使用你的代码 timeDiff = round(diff(datenum(time)* 24 * 6)); 它给了我143行,更接近我想要的。 **

所有其他值都会四舍五入,无论如何要阻止它?

非常感谢。

1 个答案:

答案 0 :(得分:1)

从您的回复中,凭借一些诗意许可证,您似乎正在使用带有字符串%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)丢失了? 那么你想要做的是用0来填充缺失的行,你的数据应该是这样的?

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

最后,输出:

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