converting abbreviation of months to numerical value

1 view (last 30 days)
Ted McG on 20 Oct 2020
Commented: Ameer Hamza on 20 Oct 2020
I have a large 1244x1 cell that contains jan, feb, mar,...ect and repeats. Is there an easy way to convert these to their respective numerical value (jan = 1, feb = 2, ...).
Thanks!

Ameer Hamza on 20 Oct 2020
Try something like this
C = {'jan', 'Mar', 'feb'}; % for example
M = month(cellfun(@(x) datetime(x, 'InputFormat', 'MMM'), C));

Ted McG on 20 Oct 2020
I am receiving the following error now:
Error using project (line 27)
Subscripting into a table using one subscript (as in t(i)) or three or more
subscripts (as in t(i,j,k)) is not supported. Always specify a row subscript
and a variable subscript, as in t(rows,vars).
Ameer Hamza on 20 Oct 2020
Is your data available as a table? Can you attach it as a .mat file?

Stephen Cobeldick on 20 Oct 2020
ismember makes this easy:
>> D = {'mar','apr','nov','may'}; % your data
>> C = {'jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'};
>> [~,X] = ismember(lower(D),C)
X =
3 4 11 5

Star Strider on 20 Oct 2020
Another approach:
mnth_nr = @(mth) find(strcmpi(mth, {'jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'}));
This works with a single input:
Out = mnth_nr('May')
producing:
Out =
5
and can be vectorised using cellfun with a table:
T1 = cell2table({'Feb'; 'jul'; 'Dec'}) % Create Table To Test Code
Out2 = cellfun(@(x)mnth_nr(x), T1.Var1)
producing:
T1 =
3×1 table
Var1
_______
{'Feb'}
{'jul'}
{'Dec'}
Out2 =
2
7
12
.