MATLAB Answers

0

Making a monthly mean

Asked by Jonas Damsbo on 27 Oct 2018
Latest activity Commented on by Jonas Damsbo on 27 Oct 2018
Hi
I have data for the geopotential for every 6 hours over a whole month. I want to get a mean over the data for the month. For example for January, I have 124 timesteps, each with their data, but I only want data for the whole month (1 dataset). I have tried, but I'm not sure if I've done it right? Pleas can anyone help me?
lon = ncread(filename,'longitude') ; nx = length(lon) ;
lat = ncread(filename,'latitude') ; ny = length(lat) ;
time = ncread(filename,'time') ; nt = length(time);
zmean = zeros([nx ny]);
for n = 1:nt
z = ncread(filename,'z',[1 1 nt],[nx ny 1]);
zx(:,1:ny) = z(:,ny:-1:1);
zmean = zmean + zx;
end
zmean = zmean/nt;
Here is (lon = 360x1), (lat = 181x1), (time = 124x1 int32), (z = 360x181)

  0 Comments

Sign in to comment.

2 Answers

jonas
Answer by jonas
on 27 Oct 2018
Edited by jonas
on 27 Oct 2018
 Accepted Answer

Use datetime with retime . Upload data for details.

  6 Comments

Jonas Damsbo on 27 Oct 2018
Sounds good!
Jonas Damsbo on 27 Oct 2018
It is from ncfile and the 'units' are hours since 1900-01-01 00:00:0.0 (dont ask me why)
jonas
on 27 Oct 2018
After looking at your data I think perhaps a timetable is in fact not the way to go, as I suspect that you want to retain the gridded nature of your data. If the problem is to average the monthly data, then I think there is a very simple solution. Simply,
z = ncread(filename,'z');
z_monthly(:,:,1) = mean(z,3);
This takes the average over the third dimension (time). Then you can simply put february's data in z_monthly(:,:,2) etc... and you will end up with a lat x lon x n matrix where n is the number of months.
If the data is uniformly spaced, then I see no point in using retime. If some data is missing, however, then you'd probably want to interpolate before taking the average.
I would also suggest you take your time-vector and convert it to datetime, to make life easier for you.
t = datetime(1900,1,1,0,0,0)+hours(time);
t =
124×1 datetime array
01-Dec-1979 00:00:00
01-Dec-1979 06:00:00
01-Dec-1979 12:00:00
Did I understand the issue?

Sign in to comment.


Answer by Jonas Damsbo on 27 Oct 2018

I think I understand your solution. You can see I have data for one month for every 6 hour and I want the mean for the month (over all hours in the month - in this example December).

  2 Comments

jonas
on 27 Oct 2018
If you load the data one month at a time, then you can just average all the data along the time dimension. If you load more than one month, then you need to split the data in n segments when taking the mean (where n is the number of months).
Jonas Damsbo on 27 Oct 2018
Great! Thank you!

Sign in to comment.