在使用MATLAB的多个Excel文件中的平均数据

我有如下所示的多个Excel文件(小时数据)。 我想获得日常的平均值(例如从第二天的17:00到16:00)。我只知道一点Matlab。 目前我的解决scheme是在下面,但有一些问题。

  1. 读取每个excel文件并将数据存储在一个variables中。
  2. 合并所有的数据在一个单一的variables。
  3. 在17:00查找行号(n)。 为此,我获得了每行的date,然后search(查找)对应于17:00的date。
  4. 平均每两行之间的数据(n(i))。

如果原始数据是正确的,它工作正常。 但是问题在下面。

  1. 17:00的一些数据丢失。 所以当它试图在17:00查找行时会出错。
  2. 当我有超过100个Excel文件,它运行非常缓慢。

有谁能提出一些build议如何解决这个问题? 我更喜欢使用Matlab,因为它是我所知道的唯一一个工具。 非常感谢!

编辑1 :提供的代码

以下是获取日常平均的代码。 我已经将文件“summary_file.xls”中的所有数据(该部分的代码未显示。

如下所示的示例表。

  1. 9月1日17:00至9月2日之间的平均时间没有问题。
  2. 对于缺less数据的日子,我想在17:00之前获得所有可用数据的平均值。
  3. 例如:由于9月3日17:00的数据缺失,无法获得9月2 – 3日的平均值。 对于这种情况,我想在17:00之前获得所有数据的平均值(即9月3日9:00)
  4. 那么9月3 – 4日,我想从18:00开始计算平均值。
  5. 对于所有数据缺失的日子,只需将所有数据设为0或标记为不可用。

[num,txt,raw] = xlsread('summary_file.xls'); %读取文件

date_num = num(:,11); % read the column containing date number starting = '2003/09/05-17:00'; % starting time starting = datenum(starting,formatIn_2); % convert starting time to date number ending = '2003/09/09-17:00';% ending time ending = datenum(ending,formatIn_2); %convert ending time to date number s = starting:1:ending; % All date number with 17:00 %% find the row number with 17:00 for i = 1:ending-starting+1 [a(i) b(i)] = find(date_num==s(i)); end %% Store the averaged data in variable p for i = 1:ending-starting p(i,:) = mean(num(a(i):a(i+1)-1,:)); end 

样本input数据 –

 + ------ + ------- + ---------- + ------- ------- + ------- + + ------- ------- + ------- + +
 |  2003 |  1-Sep |  15:00 |  100.2 |  29 |  70.5 |  3.903 |  728 |  0 |
 + ------ + ------- + ---------- + ------- ------- + ------- + + ------- ------- + ------- + +
 |  2003 |  1-Sep |  16:00 |  100.1 |  29.31 |  70.7 |  4.328 |  611.8 |  0 |
 |  2003 |  1-Sep |  17:00 |  100.1 |  29.64 |  67.06 |  3.719 |  434.8 |  0 |
 |  2003 |  1-Sep |  18:00 |  100.1 |  29.67 |  64.4 |  3.005 |  172.4 |  0 |
 |  2003 |  1-Sep |  19:00 |  100.1 |  29.06 |  68.22 |  2.292 |  19.89 |  0 |
 |  2003 |  1-Sep |  20:00 |  100.2 |  28.43 |  74.7 |  2.436 |  0.428 |  0 |
 |  2003 |  1-Sep |  21:00 |  100.2 |  27.92 |  76.2 |  1.931 |  0.006 |  0 |
 |  2003 |  1-Sep |  22:00 |  100.3 |  27.67 |  77.3 |  1.825 |  0.007 |  0 |
 |  2003 |  1-Sep |  23:00 |  100.4 |  27.55 |  77.9 |  1.622 |  0.007 |  0 |
 |  2003 |  1-Sep |  24:00:00 |  100.4 |  27.69 |  77.8 |  0.863 |  0.008 |  0 |
 |  2003 |  2-Sep |  1:00 |  100.4 |  27.55 |  78.3 |  0.879 |  0.008 |  0 |
 |  2003 |  2-Sep |  2:00 |  100.3 |  27.05 |  82.1 |  1 |  0.016 |  0.762 |
 |  2003 |  2-Sep |  3:00 |  100.3 |  26.41 |  86.8 |  0.805 |  0.006 |  0 |
 |  2003 |  2-Sep |  4:00 |  100.2 |  26.6 |  85.5 |  0.522 |  0.011 |  0.508 |
 |  2003 |  2-Sep |  5:00 |  100.2 |  25.53 |  83.8 |  2.158 |  0.011 |  0 |
 |  2003 |  2-Sep |  6:00 |  100.3 |  24.5 |  86.6 |  2.711 |  0.016 |  0 |
 |  2003 |  2-Sep |  7:00 |  100.4 |  24.85 |  86.9 |  2.562 |  0.016 |  4.318 |
 |  2003 |  2-Sep |  8:00 |  100.6 |  21.11 |  94 |  8.15 |  9.96 |  26.67 |
 |  2003 |  2-Sep |  9:00 |  100.6 |  22.23 |  91.9 |  5.065 |  31.67 |  0.254 |
 |  2003 |  2-Sep |  10:00 |  100.6 |  23.51 |  88.8 |  5.742 |  39.16 |  0.254 |
 |  2003 |  2-Sep |  11:00 |  100.6 |  24 |  87.7 |  4.494 |  97.8 |  0 |
 |  2003 |  2-Sep |  12:00 |  100.6 |  24.69 |  85.3 |  4.709 |  142.2 |  0 |
 |  2003 |  2-Sep |  13:00 |  100.5 |  25.57 |  82.8 |  5.66 |  259.1 |  0 |
 |  2003 |  2-Sep |  14:00 |  100.4 |  25.69 |  81.9 |  5.634 |  157.5 |  0 |
 |  2003 |  2-Sep |  15:00 |  100.3 |  26.18 |  79.1 |  5.564 |  308.2 |  0 |
 |  2003 |  2-Sep |  16:00 |  100.3 |  26.08 |  78.3 |  6.283 |  135.3 |  0 |
 |  2003 |  2-Sep |  17:00 |  100.3 |  25.75 |  81.2 |  4.595 |  55.68 |  0.762 |
 |  2003 |  2-Sep |  18:00 |  100.3 |  25.01 |  84.5 |  4.843 |  55.21 |  1.778 |
 |  2003 |  2-Sep |  19:00 |  100.3 |  25.15 |  86.1 |  1.433 |  22.43 |  0 |
 |  2003 |  2-Sep |  20:00 |  100.3 |  24.98 |  86.1 |  1.985 |  0.301 |  0 |
 |  2003 |  2-Sep |  21:00 |  100.3 |  24.75 |  85.1 |  0.712 |  0.009 |  0 |
 |  2003 |  2-Sep |  22:00 |  100.4 |  24.76 |  85.3 |  1.546 |  0.011 |  0 |
 |  2003 |  2-Sep |  23:00 |  100.5 |  24.92 |  84.5 |  1.186 |  0.008 |  0 |
 |  2003 |  2-Sep |  24:00:00 |  100.5 |  24.96 |  84.9 |  1.31 |  0.007 |  0 |
 |  2003 |  3月9日|  1:00 |  100.5 |  25 |  85.3 |  0.702 |  0.012 |  0 |
 |  2003 |  3月9日|  2:00 |  100.5 |  24.99 |  86 |  0.35 |  0.017 |  0 |
 |  2003 |  3月9日|  3:00 |  100.4 |  25.07 |  86.1 |  0.69 |  0.008 |  0 |
 |  2003 |  3月9日|  4:00 |  100.3 |  24.92 |  86.5 |  1.347 |  0.011 |  0 |
 |  2003 |  3月9日|  5:00 |  100.3 |  25.27 |  85.5 |  0.834 |  0.009 |  0 |
 |  2003 |  3月9日|  6:00 |  100.3 |  24.97 |  86.9 |  0.627 |  0.012 |  0 |
 |  2003 |  3月9日|  7:00 |  100.3 |  24.8 |  87.7 |  0.755 |  0.108 |  0 |
 |  2003 |  3月9日|  8:00 |  100.4 |  25.54 |  85 |  0.202 |  37.11 |  0 |
 |  2003 |  3月9日|  9:00 |  100.4 |  26.72 |  81 |  1.853 |  219.4 |  0 |
 |  2003 |  3月9日|  18:00 |  100.2 |  29.67 |  56.39 |  2.856 |  456.2 |  0 |
 |  2003 |  3月9日|  19:00 |  100.2 |  30.17 |  53.66 |  2.204 |  266 |  0 |
 + ------ + ------- + ---------- + ------- ------- + ------- + + ------- ------- + ------- + +

以下代码可能符合您的要求。 再一次,因为你对日常平均数感兴趣,所以输出会更小,因为它已经超过了24小时,我假设你需要这个。 此外,它会照顾你缺less的数据条件。

代码 –

 %% Setup params and data start_hour = 17; [num,txt,raw] = xlsread('summary_file.xls'); datenums = NaN(size(num,1),1); for count = 1:size(num,1) year1 = cell2mat(raw(count,1)); date1 = cell2mat(raw(count,2)); time1 = cell2mat(raw(count,3)); date_str = strcat( num2str(year1) , '-', date1 ); datenums(count) = datenum( date_str, 'yyyy-dd-mmm') + time1(:); end %% Take care of conditions firstdata_start_hour = round(24*cell2mat(raw(1,3))); if firstdata_start_hour > 17 start1 = floor(datenums(1)) + (start_hour/24); elseif firstdata_start_hour < 17 start1 = floor(datenums(1))-1 + (start_hour/24); else start1 = datenums(1); end ind1 = floor(datenums-start1) + 1; %% Start Processing num_items = size(num,2)-3; num_days = max(ind1); bins = NaN(num_days,num_items); for count1 = 1:size(bins,2) for count2 = 1:size(bins,1) bins(count2,count1) = mean(num(find(ind1==count2),count1+3)); end end bins(isnan(bins))=0; average_nums = bins 

根据我的要求,由OP编制的某些数据平均值的输出 –

 +-----------+---------------+------+-------------+------------+-----------+--------------+ | Date | Pressure(kPa) | Temp | Humidity(%) | W-spd(m/s) | Radiation | Rainfall(mm) | +-----------+---------------+------+-------------+------------+-----------+--------------+ | 8/10/2009 | 100.1 | 25.8 | 79.1 | 1.4 | 82.6 | 1.7 | | 8/11/2009 | 100.2 | 27.5 | 75.7 | 1.9 | 173.8 | 0.0 | | 8/12/2009 | 100.1 | 28.4 | 73.5 | 2.1 | 177.1 | 0.0 | | 8/13/2009 | 100.0 | 28.4 | 73.2 | 2.5 | 197.4 | 0.0 | | 8/14/2009 | 100.0 | 28.5 | 73.5 | 2.2 | 151.2 | 0.0 | | 8/15/2009 | 100.2 | 27.3 | 75.4 | 1.2 | 96.2 | 0.4 | | 8/16/2009 | 100.2 | 27.1 | 75.5 | 1.4 | 122.6 | 0.0 | | 8/17/2009 | 100.2 | 27.2 | 75.7 | 1.5 | 158.3 | 0.2 | | 8/18/2009 | 100.2 | 27.5 | 72.2 | 1.4 | 186.4 | 0.0 | | 8/19/2009 | 100.3 | 28.4 | 68.4 | 1.9 | 186.9 | 0.0 | | 8/20/2009 | 100.3 | 28.1 | 69.2 | 2.0 | 184.8 | 0.0 | | 8/21/2009 | 100.3 | 26.5 | 75.8 | 1.3 | 122.3 | 0.6 | +-----------+---------------+------+-------------+------------+-----------+--------------+ 

对于多个excel文件,你必须循环遍历所有这些文件。 似乎没有任何其他出路。

当您使用Matlab的xlsread它打开并closuresExcel COM服务器,因此与多个文件一起使用会减慢执行速度。 在Matlab Central阅读这篇文章 ,解释如何避免打开和closuresExcel COM Server。

至于缺失的数据,也许你可以插入17点的数据从find(time<17:00,'last')find(time>17:00,'first')

我喜欢使用MATLAB,但如果你不介意我问,你有没有考虑使用R统计软件包? 在我看来,这真的很酷,你不必同意我的看法。

做你所要求的任务是很容易的。 R甚至可以处理丢失的数据,并轻松解决它,并可以轻松地读取Excel文件,并search您想要的数据。

在哪里得到R:

http://cran.r-project.org/