我需要将一个日期数字转换为最接近月末的日期。我找到了一个在线链接,但对于大型矩阵来说非常低效(位于http://www.mathworks.com/matlabcentral/fileexchange/26374-round-off-dates-and-times)。Matlab (金融工具箱
)是否有内置函数可以实现这一功能?我没有找到。
date_in = 734421 ;
somefunction(date_in) --> Sept 2010
谢谢!
我需要将一个日期数字转换为最接近月末的日期。我找到了一个在线链接,但对于大型矩阵来说非常低效(位于http://www.mathworks.com/matlabcentral/fileexchange/26374-round-off-dates-and-times)。Matlab (金融工具箱
)是否有内置函数可以实现这一功能?我没有找到。
date_in = 734421 ;
somefunction(date_in) --> Sept 2010
谢谢!
基本上,您似乎正在询问给定日期是否更接近前一个月或后一个月。如果使用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
我之前的版本有一些错误。这里将逻辑整合到一个函数中。它还会检查月份并进行相应的更新。
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
roundMonth(datenum('20-Dec-2010'))
ans =
Jan 2011
4.
roundMonth(datenum('10-Jan-2010'))
ans =
Dec 2009
datestr
对向量的处理不太好。但是,这个问题可以通过编写自己的转换函数来轻松解决。或者,您可以使用 arrayfun
来操作数组。 - user616736~(month-2)
的代码是处理二月这个特殊情况的,对吧? - Jonas Heidelberg