我有一个如下的单元格数组,它们是日期。我想知道如何在最后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'
答案 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')