Вот что я думаю, это возможная ошибка:
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
Насколько я понимаю, это должно возвращать конец 4-го месяца 1994 года. Пожалуйста, сообщите, действительно ли это ошибка.
Вот что я думаю, это возможная ошибка:
require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
[1] "1994-05-01"
Насколько я понимаю, это должно возвращать конец 4-го месяца 1994 года. Пожалуйста, сообщите, действительно ли это ошибка.
Это не баг, это задокументированная фича. Это определенно не ошибка в . (Правка. 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"
duration
и period
обрабатывают изменчивую природу длины months
и minutes
, довольно запутанно. Я мог бы подождать, пока @hadley (или кто-то еще) добавит окончательный ответ. Я читал справку для period
и duration
, и ни один из них не хочет утверждать, что они будут работать безупречно в течение нескольких месяцев (хотя в этом примере duration
, похоже, работает
- person mnel; 21.02.2013
duration
и period
в свете этого примера. посмотрим, есть ли у @hadley возможность прокомментировать и объяснить.
- person Alex; 21.02.2013
confusion over how month addition works with lubridate
- person mnel; 21.02.2013
x + days(1) + months(1)
отличаться от x + months(1) + days(1)
- person hadley; 21.02.2013
duration(1, 'months')
- это 2628000 с, 1/12 года. Это только удача, что это работает в этом случае. Период — это что-то значимое для человека.
- person hadley; 21.02.2013
duration
имеет смысл. как насчет period
? к вашему предыдущему вопросу: 1 месяц после 28 января 2000 года является последней датой 2000-02-XX в моей голове, если смысл period
состоит в том, чтобы работать с человеческим понятием времени. если нет, то я вообще не вижу смысла иметь period
. могли бы вы объяснить?
- person Alex; 04.03.2013
period
у всех разное... тогда что это на самом деле за смазка? это то, что не имеет смысла для меня. Спасибо за вашу помощь.
- person Alex; 06.03.2013