How to seasonalise daily weather classification and precipitation data

조회 수: 1 (최근 30일)
Hi,
I'm working on a climate data set for Svalbard from August 1957 to May 2015. I have daily rainall data (mm) and an associated weather classification number (1-11) which corresponds to a weather type for that day.
I'm trying to seasonalise this, for e.g. I want to see how much Rainfall fell on days associated with weather type 1 in spring but I'm having no luck.
Can anyone help?
I've managed to create whole time periods of weather type 1 precipitation for e.g my reference period 1971-00, but I need to seasonalise it first.
Data is attached, with KNG01date_d being the day, and KNG01rain_d being the rainfall (both start 1957.09).
In the attached data, column 1 represents weather type (1-11) and column 2 is the daily rainfall for that data.
For example. My script for finding total rain from weather type 1 between 1971 to 2000:
WC1_1971_00_KNG01_rain = find(KNG01rain_d(4871:15828,1)==1);
Sum_Rain7100_KNG01 = sum(KNG01rain_d(WC1_1971_00_KNG01_rain, :));
WC1_7100 = Sum_Rain7100_KNG01(2);
My question is, how can I seasonalise this to have Spring Summer Autumn Winter and then create weather types 1-11 with corresponding precipiation from that?
Sorry for the long winded and perhaps difficult to understand explanation
Thanks to anyone who can help!
  댓글 수: 1
dpb
dpb 2019년 3월 31일
So which months of the year are considered to be which seasons?
See findgroups and splitapply and friends.
I'd suggest using a timeseries object to hold the data or table

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2019년 3월 31일
편집: Guillaume 2019년 3월 31일
Up on the right of the page, there is a field for you to tell your version of matlab. Since it's not filled, I'm assuming a modern enough version that my answer below will work:
The simplest way to do what you want is to store your data in a timetable.
raindata = array2timetable(KNG01rain_d, 'StartTime', datetime(1957, 8,1, 'Format', 'dd-MMM-yyyy'), ...
'TimeStep', days(1), ...
'VariableNames', {'weathertype', 'rainfall'});
Then we can easily add information to the table, such as season:
raindata.season = quarter(raindata.Time);
And if we want to know the sum of rainfall for each season and weather time:
rainfall_per_season_and_weather = groupsummary(raindata, {'season', 'weathertype'}, 'sum')
There are plenty more functions to perform calculations on groups, such as rowfun, splitapply, etc., in modern matlab.
If you want to perform the above just for a certain period:
groupsummary(raindata(isbetween(raindata.Time, datetime(1971,1,1), datetime(1999, 12, 31)), :), ...
{'season', 'weathertype'}, 'sum')
edit: Now that you've attached your date matrix (I thought you left it up to us to work out the date range), you can also build the timetable with:
raindata = array2timetable(KNG01rain_d, ...
'RowTimes', datetime(KNG01date_d, 'ConvertFrom', 'datenum', 'Format', 'dd-MMM-yyyy'), ...
'VariableNames', {'weathertype', 'rainfall'});
According to this, your data starts in september, not august.
Also, I forgot to say, the find in your original code is completely unnecessary
WC1_1971_00_KNG01_rain = KNG01rain_d(4871:15828,1)==1; %no need for find use the logical array directly
Sum_Rain7100_KNG01 = sum(KNG01rain_d(WC1_1971_00_KNG01_rain, :));

추가 답변 (1개)

Andrei Bobrov
Andrei Bobrov 2019년 3월 31일
편집: Andrei Bobrov 2019년 3월 31일
Where KNG01date_d?
date1 = datetime(KNG01date_d,'ConvertFrom','datenum');
TT = array2timetable(KNG01rain_d,'RowTimes',date1,...
'v',{' weather_type','rainfall'});
TT.season = discretize(month(TT.Time),[1,3:3:12,13],'categorical',...
{'Winter','Spring','Summer','Autumn','Winter'});
TT_out = varfun(@sum,TT,'GroupingVariables',{'season','weather_type'});
or
TT_out2 = groupsummary(TT,{'season','weather_type'},'sum');
  댓글 수: 3
dpb
dpb 2019년 3월 31일
Please attach to original Q?...

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Weather and Atmospheric Science에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by