将日期转换为最接近月末的日期 MATLAB

4

2
你的意思是最接近月底吗?734421代表了2010年10月10日,你想让它变成2010年9月?那么2010年9月28日就会变成2010年10月? - user616736
是的,尤达。假设您有可用的财务数据,并且必须使用最近的月末汇率。谢谢! - Maddy
为什么2010年9月底与2010年10月相比,不更接近于9月28日? - Jonas Heidelberg
我想我现在可能明白了:在你的情况下,“end”是否也可以表示“开始之前”?如果你有一个九月份的日期,你想要最接近的月份(在九月份之前或之后),但不包括九月份本身? - Jonas Heidelberg
@Jonas Heidelberg:根据上面的评论,这是我理解的意思:最接近的前一个或后一个月。听起来有点奇怪,但似乎是OP想要的。 - gnovice
1
@gnovice,我在想是否应该更改问题的标题/文本。对我来说,“月底”实际上对于这里实际上被问到的内容来说真的很误导人... - Jonas Heidelberg
2个回答

6

基本上,您似乎正在询问给定日期是否更接近前一个月或后一个月。如果使用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
+1,因为它比Yoda的解决方案更易懂,并在他的四个测试用例中提供相同的输出;-)。 - Jonas Heidelberg

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

此外,您需要小心处理像2月份28/29天的普通/闰年这样的边缘情况,因此它不总是与15进行比较... 处理日期永远不是一件容易的事情! - Amro
@Amro:同意,日期总是很混乱。 对于二月,您只需将15替换为14,而28/29与30/31相同。必须选定15或16(或2月的14/15)作为中点,并且选择是任意的。我已更新以考虑2月和年份的更改(上年12月或下年1月)。 - user616736
此外 - 这仅处理单个日期。它无法处理日期数组。 - Marc
@Marc:datestr 对向量的处理不太好。但是,这个问题可以通过编写自己的转换函数来轻松解决。或者,您可以使用 arrayfun 来操作数组。 - user616736
你的 ~(month-2) 的代码是处理二月这个特殊情况的,对吧? - Jonas Heidelberg
@Jonas:没错。如果是二月,减去14而不是15。 - user616736

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接