changing the date form in a cell matrix

2 次查看(过去 30 天)
Dear all,
i have the following cell matrix
A = {
[1] 'SLO' ' ' '' ''
[1] 'SLO' ' ' '' ''
[1] 'SLO' ' ' '' ''
[1] 'SLO' 'M 2009' 'SLO' 'MA'
[1] 'SLO' 'A 2009' 'SLO' 'MA'
[1] 'SLO' 'M 2009' 'SLO' 'MA'
[1] 'SLO' 'J 2009' 'SLO' 'MA'
[1] 'SLO' 'J 2009' 'SLO' 'MA'
[1] 'SLO' 'A 2009' 'SLO' 'MA'
[1] 'SLO' 'S 2009' 'SLO' 'MA'
[1] 'SLO' 'O 2009' 'SLO' 'MA'
[1] 'SLO' 'N 2009' 'SLO' 'MA'
[1] 'SLO' 'D 2009' 'SLO' 'MA'
[1] 'SLO' 'J 2010' 'SLO' 'MA'
[1] 'SLO' 'F 2010' 'SLO' 'MA'
[1] 'SLO' 'M 2010' 'SLO' 'MA'
[1] 'SLO' 'A 2010' 'SLO' 'MA'
[1] 'SLO' 'M 2010' 'SLO' 'MA'
[1] 'SLO' 'J 2010' 'SLO' 'MA'
[1] 'SLO' 'J 2010' 'SLO' 'MA'
[1] 'SLO' 'A 2010' 'SLO' 'MA'
[1] 'SLO' 'S 2010' 'SLO' 'MA'
[1] 'SLO' 'O 2010' 'SLO' 'MA'
[1] 'SLO' 'N 2010' 'SLO' 'MA'
[1] 'SLO' 'D 2010' 'SLO' 'MA'
[1] 'SLO' 'J 2011' 'SLO' 'MA'
[1] 'SLO' 'F 2011' 'SLO' 'MA'
[1] 'SLO' 'M 2011' 'SLO' 'MA'
[1] 'SLO' 'A 2011' 'SLO' 'MA'
[1] 'SLO' 'M 2011' 'SLO' 'MA'
[1] 'SLO' 'J 2011' 'SLO' 'MA'
[1] 'SLO' 'J 2011' 'SLO' 'MA'
[1] 'SLO' 'A 2011' 'SLO' 'MA'
[2] 'KKK' ' ' ' ' ''
[2] 'SLO' ' ' ' ' ''
[2] 'SLO' ' ' '' ''
[2] 'SLO' 'M 2009' 'SLO' 'MA'
[2] 'SLO' 'A 2009' 'SLO' 'MA'
[2] 'SLO' 'M 2009' 'SLO' 'MA'
[2] 'SLO' 'J 2009' 'SLO' 'MA'
[2] 'SLO' 'J 2009' 'SLO' 'MA'
[2] 'SLO' 'A 2009' 'SLO' 'MA'
[2] 'SLO' 'S 2009' 'SLO' 'MA'
[2] 'SLO' 'O 2009' 'SLO' 'MA'
[2] 'SLO' 'N 2009' 'SLO' 'MA'
[2] 'SLO' 'D 2009' 'SLO' 'MA'
[2] 'SLO' 'J 2010' 'SLO' 'MA'
[2] 'SLO' 'F 2010' 'SLO' 'MA'
[2] 'SLO' 'M 2010' 'SLO' 'MA'
[2] 'SLO' 'A 2010' 'SLO' 'MA'
[2] 'SLO' 'M 2010' 'SLO' 'MA'
[2] 'SLO' 'J 2010' 'SLO' 'MA'
[2] 'SLO' 'J 2010' 'SLO' 'MA'
[2] 'SLO' 'A 2010' 'SLO' 'MA'
[2] 'SLO' 'S 2010' 'SLO' 'MA'
[2] 'SLO' 'O 2010' 'SLO' 'MA'
[2] 'SLO' 'N 2010' 'SLO' 'MA'
[2] 'SLO' 'D 2010' 'SLO' 'MA'
[2] 'SLO' 'J 2011' 'SLO' 'MA'
[2] 'SLO' 'F 2011' 'SLO' 'MA'
[2] 'SLO' 'M 2011' 'SLO' 'MA'
[2] 'SLO' 'A 2011' 'SLO' 'MA'
[2] 'SLO' 'M 2011' 'SLO' 'MA'
[2] 'SLO' 'J 2011' 'SLO' 'MA'
[2] 'SLO' 'J 2011' 'SLO' 'MA'
[2] 'SLO' 'A 2011' 'SLO' 'MA'
[3] 'MMM' ' ' '' ''
[3] 'SLO' ' ' '' ''
[3] 'SLO' ' ' '' ''
[3] 'SLO' 'M 2009' 'SLO' 'MA'
[3] 'SLO' 'A 2009' 'SLO' 'MA'
[3] 'SLO' 'M 2009' 'SLO' 'MA'
[3] 'SLO' 'J 2009' 'SLO' 'MA'
[3] 'SLO' 'J 2009' 'SLO' 'MA'
[3] 'SLO' 'A 2009' 'SLO' 'MA'
[3] 'SLO' 'S 2009' 'SLO' 'MA'
[3] 'SLO' 'O 2009' 'SLO' 'MA'
[3] 'SLO' 'N 2009' 'SLO' 'MA'
[3] 'SLO' 'D 2009' 'SLO' 'MA'
[3] 'SLO' 'J 2010' 'SLO' 'MA'
[3] 'SLO' 'F 2010' 'SLO' 'MA'
[3] 'RRR' 'M 2010' 'SLO' 'MA'
[3] 'RRR' 'A 2010' 'SLO' 'MA'
[3] 'SLO' 'M 2010' 'SLO' 'MA'
[3] 'SLO' 'J 2010' 'SLO' 'MA'
[3] 'SLO' 'J 2010' 'SLO' 'MA'
[3] 'SLO' 'A 2010' 'SLO' 'MA'
[3] 'SLO' 'S 2010' 'SLO' 'MA'
[3] 'SLO' 'O 2010' 'SLO' 'MA'
[3] 'SLO' 'N 2010' 'SLO' 'MA'
[3] 'SLO' 'D 2010' 'SLO' 'MA'
[3] 'SLO' 'J 2011' 'SLO' 'MA'
[3] 'SLO' 'F 2011' 'SLO' 'MA'
[3] 'SLO' 'M 2011' 'SLO' 'MA'
[3] 'SLO' 'A 2011' 'SLO' 'MA'
[3] 'SLO' 'M 2011' 'SLO' 'MA'
[3] 'SLO' 'J 2011' 'SLO' 'MA'
[3] 'SLO' 'J 2011' 'SLO' 'll'
[3] 'SLO' 'A 2011' 'SLO' 'll'
}
My goal is to obtain this one
A = {
[1] 'SLO' ' ' '' ''
[1] 'SLO' ' ' '' ''
[1] 'SLO' ' ' '' ''
[1] 'SLO' '3/2009' 'SLO' 'MA'
[1] 'SLO' '4/2009' 'SLO' 'MA'
[1] 'SLO' '5/2009' 'SLO' 'MA'
[1] 'SLO' '6/2009' 'SLO' 'MA'
[1] 'SLO' '7/2009' 'SLO' 'MA'
[1] 'SLO' '8/2009' 'SLO' 'MA'
[1] 'SLO' '9/2009' 'SLO' 'MA'
[1] 'SLO' '10/2009' 'SLO' 'MA'
[1] 'SLO' '11/2009' 'SLO' 'MA'
[1] 'SLO' '12/2009' 'SLO' 'MA'
[1] 'SLO' '1/20010' 'SLO' 'MA'
[1] 'SLO' '2/2010' 'SLO' 'MA'
[1] 'SLO' '3/2010' 'SLO' 'MA'
[1] 'SLO' '4/2010' 'SLO' 'MA'
[1] 'SLO' '5/2010' 'SLO' 'MA'
[1] 'SLO' '6/2010' 'SLO' 'MA'
[1] 'SLO' '7/2010' 'SLO' 'MA'
[1] 'SLO' '8/2010' 'SLO' 'MA'
[1] 'SLO' '9/2010' 'SLO' 'MA'
[1] 'SLO' '10/2010' 'SLO' 'MA'
[1] 'SLO' '11/2010' 'SLO' 'MA'
[1] 'SLO' '12/2010' 'SLO' 'MA'
[1] 'SLO' '1/2011' 'SLO' 'MA'
[1] 'SLO' '2/2011' 'SLO' 'MA'
[1] 'SLO' '3/2011' 'SLO' 'MA'
[1] 'SLO' '4/2011' 'SLO' 'MA'
[1] 'SLO' '5/2011' 'SLO' 'MA'
[1] 'SLO' '6/2011' 'SLO' 'MA'
[1] 'SLO' '7/2011' 'SLO' 'MA'
[1] 'SLO' '8/2011' 'SLO' 'MA'
}
and so forth for the rest of the individuals
where as you can see in the third column I have replace for example the month 'M 2009' with '3/2009'.
In my case i have 30000 individuals
Is there any code for achieving this?
Thanks
  3 个评论
salva
salva 2012-7-26
编辑:salva 2012-7-26
perhaps by going one step back: that is this is my very original matrix
A={
1 'SLO' ' ' '' ''
1 'SLO' ' ' '' ''
1 'SLO' ' ' '' ''
1 'SLO' 'MA 2009' 'SLO' 'MA'
1 'SLO' 'MJ 2009' 'SLO' 'MA'
1 'SLO' 'JA 2009' 'SLO' 'MA'
1 'SLO' 'SO 2009' 'SLO' 'MA'
1 'SLO' 'ND 2009' 'SLO' 'MA'
1 'SLO' 'JF 2010' 'SLO' 'MA'
1 'SLO' 'MA 2010' 'SLO' 'MA'
1 'SLO' 'MJ 2010' 'SLO' 'MA'
1 'SLO' 'JA 2010' 'SLO' 'MA'
1 'SLO' 'SO 2010' 'SLO' 'MA'
1 'SLO' 'ND 2010' 'SLO' 'MA'
1 'SLO' 'JF 2011' 'SLO' 'MA'
1 'SLO' 'MA 2011' 'SLO' 'MA'
1 'SLO' 'MJ 2011' 'SLO' 'MA'
1 'SLO' 'JA 2011' 'SLO' 'MA'
2 'KKK' ' ' ' ' ''
2 'SLO' ' ' ' ' ''
2 'SLO' ' ' '' ''
2 'SLO' 'MA 2009' 'SLO' 'MA'
2 'SLO' 'MJ 2009' 'SLO' 'MA'
2 'SLO' 'JA 2009' 'SLO' 'MA'
2 'SLO' 'SO 2009' 'SLO' 'MA'
2 'SLO' 'ND 2009' 'SLO' 'MA'
2 'SLO' 'JF 2010' 'SLO' 'MA'
2 'SLO' 'MA 2010' 'SLO' 'MA'
2 'SLO' 'MJ 2010' 'SLO' 'MA'
2 'SLO' 'JA 2010' 'SLO' 'MA'
2 'SLO' 'SO 2010' 'SLO' 'MA'
2 'SLO' 'ND 2010' 'SLO' 'MA'
2 'SLO' 'JF 2011' 'SLO' 'MA'
2 'SLO' 'MA 2011' 'SLO' 'MA'
2 'SLO' 'MJ 2011' 'SLO' 'MA'
2 'SLO' 'JA 2011' 'SLO' 'MA'
3 'MMM' ' ' '' ''
3 'SLO' ' ' '' ''
3 'SLO' ' ' '' ''
3 'SLO' 'MA 2009' 'SLO' 'MA'
3 'SLO' 'MJ 2009' 'SLO' 'MA'
3 'SLO' 'JA 2009' 'SLO' 'MA'
3 'SLO' 'SO 2009' 'SLO' 'MA'
3 'SLO' 'ND 2009' 'SLO' 'MA'
3 'SLO' 'JF 2010' 'SLO' 'MA'
3 'RRR' 'MA 2010' 'SLO' 'MA'
3 'SLO' 'MJ 2010' 'SLO' 'MA'
3 'SLO' 'JA 2010' 'SLO' 'MA'
3 'SLO' 'SO 2010' 'SLO' 'MA'
3 'SLO' 'ND 2010' 'SLO' 'MA'
3 'SLO' 'JF 2011' 'SLO' 'MA'
3 'SLO' 'MA 2011' 'SLO' 'MA'
3 'SLO' 'MJ 2011' 'SLO' 'MA'
3 'SLO' 'JA 2011' 'SLO' 'll'
}
see also my previous question
Thomas
Thomas 2012-7-26
is MA March April? MJ -May June? and so on... do you have any data that says 'Jan 2009' ...?

请先登录,再进行评论。

采纳的回答

Thomas
Thomas 2012-7-26
Using the first A cell MAtrix shown in the question:
for ii=1:length(A)
A(ii,3)=strrep(A(ii,3),'S','SEP');
A(ii,3)=strrep(A(ii,3),'O','OCT');
A(ii,3)=strrep(A(ii,3),'N','NOV');
A(ii,3)=strrep(A(ii,3),'D','DEC');
A(ii,3)=strrep(A(ii,3),'F','FEB');
if strcmp(A(ii,3),A(1,3))
ii=ii+1;
else
if (cell2mat((strfind(A(ii,3),'J')))==1)
if (cell2mat(strfind(A(ii-1,3),'M')))==1
A(ii,3)=strrep(A(ii,3),'J','JUN');
elseif (cell2mat(strfind(A(ii-1,3),'J')))==1
A(ii,3)=strrep(A(ii,3),'J','JUL');
else
A(ii,3)=strrep(A(ii,3),'J','JAN');
end
end
if (cell2mat((strfind(A(ii,3),'M')))==1)
if (cell2mat(strfind(A(ii-1,3),'F')))==1
A(ii,3)=strrep(A(ii,3),'M','MAR');
else
A(ii,3)=strrep(A(ii,3),'M','MAY');
end
end
if (cell2mat((strfind(A(ii,3),'A')))==1)
if (cell2mat(strfind(A(ii-1,3),'J')))==1
A(ii,3)=strrep(A(ii,3),'A','AUG');
else
A(ii,3)=strrep(A(ii,3),'A','APR');
end
end
end
end
A(:,3) % output data
% convert to datenum
for ii=1:length(A)
if strcmp(A(ii,3),A(1,3))
ii=ii+1;
else
date_vec(ii)=datenum(A(ii,3),'mmm yyyy');
end
end

更多回答(1 个)

Davide Ferraro
Davide Ferraro 2012-7-26
编辑:Davide Ferraro 2012-7-26
The date has an ambiguous format cause "M 2009" can be march or may so a classic approac with DATENUM may not be appropriate. What I see is that you also have discontinuities.
A possible approach is to use a loop and at each step you check what letter you had the step before. I.e. if you find a M you check the previous line and if this an F you assume that M is March else it's May. A possible idea:
if A{i,3}(1) == 'M'
if A{i-1}(1) == 'F'
A{1,3} = ['3/' A{1,3}(2:end)];
else
A{1,3} = ['5/' A{1,3}(2:end)];
end
end
Surely you need to take care of all possible options and create a more complex IF-ELSE structure.

标签

Community Treasure Hunt

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

Start Hunting!

Translated by