2

かなり簡単な質問があります。次のようなセルベクトルがあります。

temp_y_date{1} = '2012Q2'
temp_y_date{2} = '2012Q1'
temp_y_date{3} = '2011Q4'

関数datenumを使用して、このセルベクトルを日付ベクトルに変換したいと思います。最初に、次のようにベクトルを「QQ-YYYY」の形式に変換します。

for i = 1:length(temp_y_date)
   temp = temp_y_date(i);
   year = cellfun(@(c) {c(1:4)}, temp);
   quarter = cellfun(@(c) {c(5:6)}, temp);
   temp_y_date(i) = strcat(quarter,'-',year);
end

temp_y_dateの値は現在

temp_y_date (1) = 'Q2-2012'
temp_y_date (2) = 'Q1-2012'
temp_y_date (3) = 'Q4-2011'

datenum関数を適用できると思いました。

temp_y_date = datenum(temp_y_date,'QQ-YYYY');

ただし、次のエラーが発生します。

??? Error using ==> datenum at 178
DATENUM failed.

Caused by:
Error using ==> dtstr2dtnummx
Failed on converting date string to date number.
4

1 に答える 1

0

R2009b と R2012a の両方でテストしました。あなたのコードは後者で動作しますが、R2009b でも同じエラーが発生します。

Q をドロップするtemp_y_dateと、古いバージョンで修正されました。したがって、明らかに古いバージョンでは、四半期の定義が受け入れられません。

作業コード:

strdate = {'2012Q2', '2012Q1', '2011Q4'};
strdate2 = cellfun(@(c) strcat(c(6),'-',c(1:4)),strdate,'uni',false);

result = datenum(strdate2,'QQ-YYYY');

変数名を変更したので、デバッグしやすくなりました。cellfun を含むループも修正しました。かなり非効率的に使用していました。セルとは何か、セルにインデックスを付ける方法を学ぶことをお勧めします。

注:別のバージョンにアップグレードした場合、または他の誰かが新しいバージョンで使用した場合、これは壊れます。したがって、それを望まない場合は、verLessThanを使用して異なるバージョンの matlab を区別することをお勧めします。

編集:

からhelp datenum:

「Q」を含む形式は、DATENUM では受け入れられません。

したがって、これを自分でアップグレードまたは実装する必要があると思いますが、それほど難しくはありません。

strdate = {'2012Q2', '2012Q1', '2011Q4'};
if verLessThan('matlab','7.12') % or maybe 7.11, it depends on which version the datenum functionality changed...
    strdate2 = cellfun(@(c) sprintf('%s/%02d/01',c(1:4),3*str2double(c(6))-2),strdate,'uni',false);
    result = datenum(strdate2,'YYYY/mm/dd');
else
    strdate2 = cellfun(@(c) strcat(c(5:6),'-',c(1:4)),strdate,'uni',false);
    result = datenum(strdate2,'QQ-YYYY');
end

ご覧のとおり、古いバージョンの datenum には完全な日付指定が必要です: 'YYYY/mm/dd'.

于 2012-08-18T07:00:40.780 に答える