time series 30 year sliding window

2 次查看(过去 30 天)
I have a set of daily data that ranges from the years 1772-2009. The data is currently in an array that has one column as the date number and one column as my data. I want to set 30 year sliding windows for this data moving a year on every time. For example I want the data to be in an array where the first column has all the data from 1772-1801, the 2nd has all the data from 1773-1802 and so on.
Each value has a corresponding date to it (year, month and day). It would be nice to be able to program MATLAB to take all the values corresponding to the years in the ranges I need.
For example I want to say something along these lines, I just dont know the exact code or if what I want to do is even possible: I already have data = my daily data
for y=1772:1979
30yearperiods(:,1,2,3...207) = temp (dependent on year== n to n+30)
Does anyone know how I can do this?
I have had major problems trying to set for loops that encompass the 30 year periods including all the leap years etc and its frustrating having to do this when I have the data I need and I just can't extreact it

采纳的回答

Fangjun Jiang
Fangjun Jiang 2011-10-2
Since not all 30-year periods contain the same number of dates (due to leap year), you'll need to use cell array to have the 30-year moving window data. It's a matter of utilizing the datenum() function.
clear;
%create an example data
StartYear=1772;
EndYear=2009;
OrigData=datenum(StartYear,1,1):(datenum(EndYear,1,1)-1);
OrigData=[OrigData',(1:length(OrigData))'];
%constrct the desired data
Period=30;
Data=cell(EndYear-StartYear-Period+1,1);
for Year=StartYear:(EndYear-Period)
StartCount=datenum(Year,1,1)-datenum(StartYear,1,1)+1;
DataCount=datenum(Year+Period,1,1)-datenum(Year,1,1);
Data{Year-StartYear+1}=OrigData(StartCount:(StartCount+DataCount-1),2);
end
>> OrigData(end,:)
ans =
733773 86563
>> Data{end}(end)
ans =
86563
  3 个评论
James
James 2011-10-3
Like I need a list of the values in the array so I can detrend, take the mean etc?
Fangjun Jiang
Fangjun Jiang 2011-10-3
To reference the 2nd data in your first 30-year period, use Data{1}(2),
100th data in the 3rd 30-year period, Data{3}(100).
Your original data has two columns, right? The first column is just date, the second column is your true data, temperature, for example. I just use a serial of numbers to mimic the second column data.

请先登录,再进行评论。

更多回答(1 个)

bahman rostami tabar
you can easily use this code:
% where data is your column data vector
% m is window length so for your case m=30;
OverlapAggregateVector=zeros(m, size(data,1)-m+1);
for k=1:m
OverlapAggregateVector(k,:)=data(k:end-m+k,1);
end

类别

Help CenterFile Exchange 中查找有关 Dates and Time 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by