путаница в том, как продолжительность и периоды работают в смазке с добавлением месяца

Вот что я думаю, это возможная ошибка:

require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
  [1] "1994-05-01"

Насколько я понимаю, это должно возвращать конец 4-го месяца 1994 года. Пожалуйста, сообщите, действительно ли это ошибка.


person Alex    schedule 20.02.2013    source источник


Ответы (1)


Это не баг, это задокументированная фича. Это определенно не ошибка в lubridate, так как months и as.Date являются функциями пакета base. . (Правка. months.numeric и months.integer являются невидимыми функциями из пакета lubridate.

Однако у luibridate есть ответ!

Он работает точно так, как указано в файле справки для %m+% (который является частью пакета lubridate).

Добавление месяцев нарушает базовую арифметику, потому что последовательные месяцы имеют разную длину. С другими элементами для арифметики полезно выполнять автоматический перенос. Например, 12:00:00 + 61 секунда становится 12:01:01. Однако люди часто предпочитают, чтобы такое поведение НЕ происходило с месяцами. Например, иногда мы хотим, чтобы 31 января + 1 месяц = ​​28 февраля, а не 3 марта. month(n) всегда возвращает дату в n-м месяце после Date. Если бы новая дата обычно перетекала в n + 1-й месяц, month. Дата n-й месяц до Даты.

Функция %m+% разработана для обеспечения нужной вам функции, гарантируя, что месяц не будет перенесен.

d %m+% months(1)

## [1] "1994-04-30" 

Обратите внимание, что эта функция была представлена ​​в версии 1.2.0 и поэтому не задокументирована в http://www.jstatsoft.org/v40/i03/paper, так как это было написано до реализации

Также обратите внимание, что вы также можете использовать duration(1, 'months')

 d + duration(1, 'months')
 ## [1] "1994-04-30" 
person mnel    schedule 20.02.2013
comment
То, как duration и period обрабатывают изменчивую природу длины months и minutes , довольно запутанно. Я мог бы подождать, пока @hadley (или кто-то еще) добавит окончательный ответ. Я читал справку для period и duration, и ни один из них не хочет утверждать, что они будут работать безупречно в течение нескольких месяцев (хотя в этом примере duration , похоже, работает - person mnel; 21.02.2013
comment
отличное объяснение, спасибо. это немного сбивает с толку относительно того, что на самом деле делают duration и period в свете этого примера. посмотрим, есть ли у @hadley возможность прокомментировать и объяснить. - person Alex; 21.02.2013
comment
@ Алекс, я бы посоветовал отредактировать заголовок, возможно, confusion over how month addition works with lubridate - person mnel; 21.02.2013
comment
Должен ли я не принимать ответ, чтобы он считал этот вопрос открытым или все равно увидит его? - person Alex; 21.02.2013
comment
Может быть идея, я не обижусь! - person mnel; 21.02.2013
comment
хорошо - я сделаю это. я приму, как только он посмотрит на это. очень ценю вашу помощь. - person Alex; 21.02.2013
comment
Учитывая выдержку из документации, я не уверен, что вы хотите, чтобы я сказал. Но математика даты и времени сложна, и не очевидно, что один месяц после 1994-03-31 должен быть 1994-03-30. Что такое один месяц после 28 января 2000 г., 29 января 2000 г. и 30 января 2001 г.? (Вы помните полные правила високосного года?). Должно ли x + days(1) + months(1) отличаться от x + months(1) + days(1) - person hadley; 21.02.2013
comment
@hadley: не могли бы вы объяснить разницу между продолжительностью и периодами? учитывая приведенный выше пример, это совершенно неясно - person Alex; 21.02.2013
comment
Продолжительность всегда измеряется в секундах, поэтому продолжительность месяца является приблизительной, как вы видите, когда запускаете duration(1, 'months') - это 2628000 с, 1/12 года. Это только удача, что это работает в этом случае. Период — это что-то значимое для человека. - person hadley; 21.02.2013
comment
@hadley: понял, duration имеет смысл. как насчет period? к вашему предыдущему вопросу: 1 месяц после 28 января 2000 года является последней датой 2000-02-XX в моей голове, если смысл period состоит в том, чтобы работать с человеческим понятием времени. если нет, то я вообще не вижу смысла иметь period. могли бы вы объяснить? - person Alex; 04.03.2013
comment
@Alex, посмотри мой предыдущий комментарий. Невозможно удовлетворить интуицию каждого во времени. - person hadley; 04.03.2013
comment
@hadley: полностью понимаю. однако, если представление о period у всех разное... тогда что это на самом деле за смазка? это то, что не имеет смысла для меня. Спасибо за вашу помощь. - person Alex; 06.03.2013
comment
@Alex это описано в статье, в документации и в моем предыдущем комментарии. Не знаю, что еще я могу вам сказать :/ - person hadley; 06.03.2013