How to get monthly average from daily data?

23 ビュー (過去 30 日間)
frankovaT
frankovaT 2018 年 9 月 27 日
編集済み: jonas 2018 年 9 月 27 日
So i have this Matrix, consisting of 4 columns: Column 1: Year Column 2: Month Column 3: day (1 to 30) Column 4: Some Value
I want to make monthly average of "some value" without breaking the matrix into some new matrix and calculate mean for each moths matrix seperately then rejoin them. I want to make an average matrix using for loop and find function for each myear seperately. So I dont like to have an average from all the first months of all the years together. Does anyone have an Idea?
I have sth like this, but i donno why it is not working:
k=1
%Calculating Monthly Average
for i=1961:1990 %Years Looping
for j=1:12 %Months Looping
idx=find((date(:,1)==i) & (date(:,2)==j)); %Find all indeces for the specific month
meandata1=mean(date(idx,4),1);
Monthly_Ave(k,:)=[i,j,meandata1;]; %Store in a new matrix the mean values per month
k=k+1;
end
end
  5 件のコメント
frankovaT
frankovaT 2018 年 9 月 27 日
Dear jonas I truly appreciate your help i attached an Excel file of my data.
jonas
jonas 2018 年 9 月 27 日
and answer updated as promised!

サインインしてコメントする。

採用された回答

jonas
jonas 2018 年 9 月 27 日
編集済み: jonas 2018 年 9 月 27 日
Not sure what you mean by "without breaking the matrix into some new matrix", but here we go:
x is column with months,
y is data
[G,name] = findgroups(x)
out = splitapply(@mean,y,G)
This will give you max 12 values, one for each month of the year. If you have several years, and you want 12 values per year, then you can do the following trick.
x1 is months (double)
x2 is years (double)
x=cellstr(num2str([x1, x2]))
[G,name] = findgroups(x)
out = splitapply(@mean,y,G)
Better yet, put your data in a timetable and use retime to calculate the monthly average. Here's an example using your data:
data=xlsread('data.xlsx')
t=datetime(data(:,1:3))
T=timetable(t,data(:,4))
T2=retime(T,'monthly','mean')
  6 件のコメント
jonas
jonas 2018 年 9 月 27 日
編集済み: jonas 2018 年 9 月 27 日
There's a typo here:
Monthly_Ave(k,:)=[i,j,meandate1;];
should be meandata1. Also date is a built in function, so don't name your variable that! Both methods give the same results, so that's reassuring :)
frankovaT
frankovaT 2018 年 9 月 27 日
Oh god! you are an angle! I was so unsure about my code that i didnt even tried to look for typos:))) My first for loop!!! thanks :)

サインインしてコメントする。

その他の回答 (1 件)

KSSV
KSSV 2018 年 9 月 27 日
Let M be your month column, extracted and A be your data.
B = zeros(12,1) ; % means
for i = 1:12
B(i) = mean(A(M==i)) ;
end
  1 件のコメント
frankovaT
frankovaT 2018 年 9 月 27 日
maybe I should have mentioned that i have 50 years of data, so if I ll have like 50, Marches, and this is going to make an average from all the Marches for instance. but i want to make an average form each daily vaule in month of a year seperately.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeData Preprocessing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by