2017-05-19 11 views
2

MATLABで文字列の日付形式を特定し、それらをすべて同じ形式にする方法が見つかりません。私はdatenum(list)を行うすべての行が同じ日付の形式を持っていないため、エラーメッセージがある場合文字列中のインスタンスの日付フォーマットを特定して均質化する方法はありますか?

list = {'01-Sep-1882'; ... 
     '01-Aug-1895'; ... 
     '04/01/1912'; ... 
     'Tue, 05/28/46'; ... 
     'Tue, 03/10/53'; ... 
     '06/20/58'; ... 
     'Thu, 09/20/73'; ... 
     'Fri, 08/15/75'; ... 
     'Sun, 12/01/1996'}; 

:私は、次のセル配列を持っています。あなたはこれを回避する方法を考えることができますか?

+0

セルlist' 'ですアレイ? – rayryeng

+0

こんにちは@レイライェン、はい、そうです。形式は次のとおりです:list = '12/15/68 '' Sun、01/15/89 '... –

+1

これを行う1つの方法は、セルの各要素をループし、それらに個別に 'datenum'を使うことです。しかし、 'Tue、Thu、Fri'などのアルファベット形式の日付で始まるセル配列内の要素に' datenum'を使用すると、MATLABには現在ビルドされていませんこの形式の日付を探すための形式指定子では、ここでエラーが出ます。これらを破棄し、日付の数値形式に頼っても安全ですか? – rayryeng

答えて

3

あなたは連続的に正しく変換されなかったこれらの日付を識別するために、各フォーマットとisnatを変換するdatetimeを適用することにより、これを行うことができます。さらに、date format stringに曜日を指定し、最後の2つの数字だけを使用して年に何を使用するかを指定することができます。あなたの質問のサンプルデータと予想される日付形式で開始し、ここでそれを行うためのコードは次のとおりです。

% Input: 
list = {'01-Sep-1882'; ... 
     '01-Aug-1895'; ... 
     '04/01/1912'; ... 
     'Tue, 05/28/46'; ... 
     'Tue, 03/10/53'; ... 
     '06/20/58'; ... 
     'Thu, 09/20/73'; ... 
     'Fri, 08/15/75'; ... 
     'Sun, 12/01/1996'}; 

% Conversion code: 
dt = datetime(list, 'Format', 'dd-MMM-yyyy'); 
index = isnat(dt); 
dt(index) = datetime(list(index), 'Format', 'MM/dd/yy', 'PivotYear', 1900); 
index = isnat(dt); 
dt(index) = datetime(list(index), 'Format', 'eee, MM/dd/yy', 'PivotYear', 1900) 

% Output: 
dt = 

    9×1 datetime array 

    01-Sep-1882 
    01-Aug-1895 
    01-Apr-1912 
    28-May-1946 
    10-Mar-1953 
    20-Jun-1958 
    20-Sep-1973 
    15-Aug-1975 
    01-Dec-1996 

今、あなたはdatenumで数値にこれらを変換することができます:

dnum = datenum(dt); 
1

ここで問題の一部は、MATLABのdatenumがこの形式を理解できないということです:Tue, 05/28/46。それで、元のリストをきれいにして理解できるようにしましょう。

% original list 
list = {'01-Sep-1882','01-Aug-1895','04/01/1912','Tue, 05/28/46','Tue, 03/10/53','06/20/58','Thu, 09/20/73','Fri, 08/15/75','Sun, 12/01/1996'} 

% split each cell in the list 
list_split = cellfun(@(x) strsplit(x,' '), list, 'UniformOutput', false); 

% now detect where there is unusual format, this will give logical array 
abnormal_idx = cellfun(@(x) length(x) == 2, list_split,'UniformOutput', true) 

% make copy 
clean_list = list; 

% now at abnormal indices retain only the part that MATLAB understands 
clean_list(abnormal_idx) = cellfun(@(x) x{2}, list_split(abnormal_idx), 'UniformOutput', false); 

% now run datenum on clean list 
date_num = cellfun(@datenum, clean_list, 'UniformOutput', true); 
関連する問題