time series 30 year sliding window

2 vues (au cours des 30 derniers jours)
James
James le 2 Oct 2011
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

Réponse acceptée

Fangjun Jiang
Fangjun Jiang le 2 Oct 2011
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 commentaires
James
James le 3 Oct 2011
Like I need a list of the values in the array so I can detrend, take the mean etc?
Fangjun Jiang
Fangjun Jiang le 3 Oct 2011
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.

Connectez-vous pour commenter.

Plus de réponses (1)

bahman rostami tabar
bahman rostami tabar le 20 Déc 2011
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

Catégories

En savoir plus sur Dates and Time dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by