2

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

4 回答 4

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)来获取字符数组,但这会使两种方法的效率大致相同。

于 2012-11-09T13:16:10.337 回答
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+\.','')));
于 2012-11-09T13:36:28.940 回答
2

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

如果您的数据位于单元格数组中,请以

M = cell2mat(C)

然后获取相关部分

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

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

Year = str2num(Y)
于 2012-11-09T13:09:45.277 回答
1

使用正则表达式,这也适用于格式略有不同的日期,例如1.1.2000,这可能会弄乱你的偏移量

res = regexp(dates, '(?<=\d+\.\d+\.)\d+', 'match')
于 2012-11-09T13:38:38.863 回答