我需要将datenumber转换为最接近的月末日期。我发现了一个在线链接,但对于一个大矩阵(http://www.mathworks.com/matlabcentral/fileexchange/26374-round-off-dates-and-times)效率非常低。 Matlab(Financial Toolbox
)是否具有内置功能?我找不到了。
date_in = 734421 ;
somefunction(date_in) --> Sept 2010
谢谢!
答案 0 :(得分:6)
基本上,这听起来像是在询问给定日期是否更接近前一个月或下一个月。如果您使用函数EOMDAY查找月末日期并ADDTODATE将当前月份向上或向下移动1,则可以大大简化所涉及的逻辑。这是一个以日期编号作为输入的示例函数:
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 :(得分:1)
我之前的版本中有一些错误。这是结合到函数中的逻辑。它还会检查月份并相应地进行更新。
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