2

イベントが発生した日付を抽出したデータセットがあります。日付は MMDDYY の形式ですが、MatLab では先行ゼロが表示されないため、多くの場合 MDDYY です。

平均または中央値 (どちらでも使用できます) の日付を見つける方法はありますか? median日数が奇数の場合は正常に機能しますが、偶数の場合は、中間の 2 つを平均しているため、適切な値が得られないと思います。日付をMatLab形式に変換しregexpて元に戻そうとしましたが、うまくいきませんでした。ありがとう

dates=[32381 41081  40581  32381  32981 41081   40981  40581];
4

4 に答える 4

5

datenumを使用して、日付をシリアル日付番号に変換できます (1 は 01/01/0000、2 は 02/01/0000、367 は 01/01/0001 など)。

strDate='27112011';
numDate = datenum(strDate,'ddmmyyyy')

平均値や中央値を取得するなど、これらの日付番号に対して任意の算術演算を実行できます。

mean(numDates)
median(numDates)

ここでの唯一の問題は、日付が文字列型ではなく数値であることです。幸い、datenum は数値入力も受け付けますが、日、月、年をベクトルで区切って指定する必要があります。

numDate = datenum([year month day])

または、複数のタイムスタンプがある場合はマトリックスの行として。

したがって、指定したサンプルデータの場合:

dates=[32381 41081  40581  32381  32981 41081   40981  40581];
years  = mod(dates,100);
dates  = (dates-years)./100;
days   = mod(dates,100);
months = (dates-days)./100;
years = years + 1900; % set the years to the 20th century

numDates = datenum([years(:) months(:) days(:)]);
fprintf('The mean date is %s\n', datestr(mean(numDates)));
fprintf('The median date is %s\n', datestr(median(numDates)));

この例では、結果の平均値と中央値をdatestrを使用して読み取り可能な日付形式に変換し直しました。これはシリアル日付番号を入力として受け取ります。

于 2012-05-06T23:05:08.007 に答える
1

これを試して:

dates=[32381 41081 40581 32381 32981 41081 40981 40581];
d=zeros(1,length(dates));
for i=1:length(dates)
    d(i)=datenum(num2str(dates(i)),'ddmmyy');
end
m=mean(d);
m_str=datestr(m,'dd.mm.yy')

この情報がお役に立てば幸いです。

于 2012-05-07T03:55:09.870 に答える
0

日付を数値として表示する方法については、上記を参照してください。

リストの中央値を見つけるという問題は追加しません。デフォルトの matlabmedian関数は、偶数の値がある場合、2 つの中間値を平均します。

しかし、あなたはそれを自分で行うことができます!これを試して:

dates; % is your array of dates in numeric form
sdates = sort(dates);
mediandate = sdates(round((length(sdates)+1)/2));
于 2012-05-07T03:30:05.133 に答える
0

日付を MMDDYY ではなく YYMMDD として保存します。これには、日付の番号順も時系列順になるという便利な副作用があります。

これは、作成できる関数の疑似コードです。

foreach date:
    year = date % 100
    date = (date - year) / 100
    day = date % 100
    date = (date - day) / 100
    month = date
    newdate = year * 100 * 100 + month * 100 + day
end for

日付を YYMMDD 形式で取得したら、(数値的に) 中央値を見つけます。これは、時系列の中央値でもあります。

于 2012-05-06T21:55:51.290 に答える