Конвертировать дату в ближайшую дату конца месяца MATLAB - PullRequest
4 голосов
/ 20 июля 2011

Мне нужно преобразовать число даты в ближайшую дату конца месяца. Я нашел онлайн-ссылку, но она очень неэффективна для большой матрицы (на http://www.mathworks.com/matlabcentral/fileexchange/26374-round-off-dates-and-times). Есть ли в Matlab (Financial Toolbox) встроенная функция для этого? Я не смог ее найти.

date_in = 734421 ;
somefunction(date_in) --> Sept 2010

Спасибо!

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

По сути, звучит так, будто вы спрашиваете, ближе ли данная дата к предыдущему или следующему месяцу.Вы можете значительно упростить логику, если используете функции EOMDAY , чтобы найти дату конца месяца, и ADDTODATE , чтобы сместить текущий месяц вверх или вниз на единицу.Вот пример функции, которая принимает номер даты в качестве ввода:

function closestString = closest_month(dateNumber)

  dateVector = datevec(dateNumber);
  daysInMonth = eomday(dateVector(1),dateVector(2));
  if dateVector(3) > daysInMonth/2
    dateNumber = addtodate(dateNumber,1,'month');
  else
    dateNumber = addtodate(dateNumber,-1,'month');
  end
  closestString = datestr(dateNumber,'mmm yyyy');

end
1 голос
/ 20 июля 2011

У меня были некоторые ошибки в моей предыдущей версии. Вот логика, встроенная в функцию. Он также проверяет месяц и обновляет соответственно.

function out = roundMonth(dateNumber)
    dateVector = datevec(dateNumber);
    day = dateVector(3);
    month = dateVector(2);
    year = dateVector(1);

    month = month + sign(day - 15 + double(~(month-2)))...
        + double(~(day-15 + double(~(month-2))));

    dateVector(1) = year + double((month-12)==1) - double((1-month)==1);
    dateVector(2) = mod(month,12) + 12*double(~mod(month,12));

    out = datestr(dateVector,'mmm yyyy');

Примеры:

1

roundMonth(datenum('10-Oct-2010'))

ans =

Sep 2010

2

roundMonth(datenum('20-Oct-2010'))

ans =

Nov 2010

3

roundMonth(datenum('20-Dec-2010'))

ans =

Jan 2011

4

roundMonth(datenum('10-Jan-2010'))

ans =

Dec 2009
...