好的,我仍然对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行,更接近我想要的。 **
所有其他值都会四舍五入,无论如何要阻止它?
非常感谢。
答案 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