# calculate the annual discharge over several years

9 views (last 30 days)
Maria Mateus on 29 Oct 2013
Commented: Maria Mateus on 29 Oct 2013
Hello,
I have a time series dataset that consists of daily discharge (Q) data from 1915-2006. My matrix: the first column is the year, the second is the month, the third is the day and the fourth column is the data of interest (Q). I need to calculate the mean annual discharge for each year and then arrange the data from the smallest Q to largest Q but knowing to which year that Q belongs.
• Year Month day Q
• 1915 10 1 2.13E+02
• 1915 10 2 2.89E+02
• 1915 10 3 8.10E+02
• ...
• ...
• 2006 12 31 2.20E+04
I am very new at Matlab and even though I found some similar examples online I can't figure this out. Any help will be really appreciated.
Thanks!
##### 2 CommentsShowHide 1 older comment
Jeremy on 29 Oct 2013
Also look at the 'sort" function, specifically when called with 2 outputs.

Cedric Wannaz on 29 Oct 2013
Edited: Cedric Wannaz on 29 Oct 2013
EDIT after you edited the question: it seems that there are 4 columns and not 2, and the discharge is in column4. I am updating my answer accordingly.
Here is an example
data = [1915, 7, 1, 6; ...
1915, 10, 3, 8; ...
1915, 12, 8, 7; ...
1916, 4, 22, 3; ...
1916, 7, 13, 2] ;
% - Get unique years and assign IDs starting at 1.
years = unique( data(:,1) ) ;
yearId = data(:,1) - min( data(:,1) ) + 1 ;
% - Compute Q mean per year.
Qmean = accumarray( yearId, data(:,4), [], @mean ) ;
% - Sort Qmean and get corresponding years.
[Qmean_sorted, ix] = sort( Qmean ) ;
years_sorted = years(ix) ;
Running this, you get
>> Qmean
Qmean =
7.0000
2.5000
>> Qmean_sorted
Qmean_sorted =
2.5000
7.0000
>> years_sorted
years_sorted =
1916
1915
##### 2 CommentsShowHide 1 older comment
Cedric Wannaz on 29 Oct 2013
You're welcome.

sixwwwwww on 29 Oct 2013
Dear Maria, here is the code for required functionality:
ID = fopen('filename.txt');
data = textscan(ID, '%f%f%f%f');
fclose(ID);
year = data{1};
interest = data{4};
count = 1;
i = 1915:2006;
avg = zeros(length(i), 2);
for i = 1915:2006
ind = find(ismember(year, i));
avg(count, 1) = i;
avg(count, 2) = sum(interest(ind)) / length(ind);
count = count + 1;
end
avg = sortrows(avg, 2);
disp(avg)
I hope it helps. Good luck!
Maria Mateus on 29 Oct 2013
Thank you. This was also really helpful. :)