如何从MATLAB中的日期单元数组中提取年份?

时间:2012-11-09 13:06:48

标签: matlab

我有一个如下的单元格数组,它们是日期。我想知道如何在最后4位数提取年份?谁能教我如何在字符串中找到年份?谢谢!

'31.12.2001'
'31.12.2000'
'31.12.2004'
'31.12.2003'
'31.12.2002'
'31.12.2000'
'31.12.1999'
'31.12.1998'
'31.12.1997'
'31.12.2005'
'31.12.2004'
'31.12.2003'
'31.12.2002'
'31.12.2001'
'31.12.2000'
'31.12.1999'
'31.12.1998'
'31.12.2005'
'31.12.2004'
'31.12.2003'
'31.12.2002'
'31.12.2005'

4 个答案:

答案 0 :(得分:4)

示例单元格数组:

A = {'31.12.2001'; '31.12.2002'; '31.12.2003'};

应用一些正则表达式:

B = regexp(A, '\d\d\d\d', 'match')
B = [B{:}];

编辑:我从未意识到matlab会“嵌套”额外的一层细胞,直到我测试了它。我现在不太喜欢这个解决方案,因为我知道第二行是必要的。这是一种替代方法,可以让您以数字形式获得多年:

C = datevec(A, 'dd.mm.yyyy');
C = C(:, 1);

第二次编辑:令人惊讶的是,如果你的单元格数组少于10000个元素,那么regexp方法在我的机器上会更快。但它的输出是另一个单元阵列(它占用的内存比数字矩阵多得多)。您可以使用B = cell2mat(B)来获取字符数组,但这会使两种方法的效率大致相等。

答案 1 :(得分:3)

只是为了添加一个有趣的答案,旨在将OP带到Matlab的陌生区域:

C = char(C);
y = (D(:,7:end)-'0') * 10.^(3:-1:0).'

比其他答案中发布的任何内容快一个数量级:)

或者,离家更近一点,

y = cellfun(@(x)str2double(x(7:end)),C);

或另一个regexp变体:

y = str2num(char(regexprep(C, '\d+\.\d+\.','')));

答案 2 :(得分:2)

假设您的日期矩阵是M或单元格数组C:

如果您的数据位于以

开头的单元格数组中
M = cell2mat(C)

然后获得相关部分

Y=M(:,end-4:end)

如果需要,您甚至可以将年份作为数字

Year = str2num(Y)

答案 3 :(得分:1)

使用regexp,这也适用于格式略有不同的日期,例如1.1.2000,这可能会让你感到不安

res = regexp(dates, '(?<=\d+\.\d+\.)\d+', 'match')