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がセルの余分なレイヤーを「ネスト」することに気づきませんでした。2行目が必要であることがわかったので、このソリューションはあまり好きではありません。数値形式で年数を取得する別のアプローチを次に示します。

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

2番目の編集:驚くべきことに、セル配列の要素が10000未満の場合、regexp私のマシンではアプローチが高速になります。ただし、その出力は別のセル配列です(数値行列よりもはるかに多くのメモリを消費します)。B = cell2mat(B)代わりに文字配列を取得するために使用できますが、これにより2つのアプローチがほぼ同等の効率になります。

于 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 に答える