Существует ли стандартный/распространенный метод/формула для вычисления числа месяцев между двумя датами в R?
Я ищу что-то, что подобно функции месяцев MathWorks
Я собирался сказать, что это просто, но difftime()
останавливается на неделях. Как странно.
Так что одним из возможных ответов было бы взломать что-нибудь:
# turn a date into a 'monthnumber' relative to an origin
R> monnb <- function(d) { lt <- as.POSIXlt(as.Date(d, origin="1900-01-01")); \
lt$year*12 + lt$mon }
# compute a month difference as a difference between two monnb's
R> mondf <- function(d1, d2) { monnb(d2) - monnb(d1) }
# take it for a spin
R> mondf(as.Date("2008-01-01"), Sys.Date())
[1] 24
R>
Кажется, это правильно. Можно было бы обернуть это в какую-нибудь простую структуру класса. Или оставить это как взлом :)
Edit: Также, похоже, работает с вашими примерами из Mathworks:
R> mondf("2000-05-31", "2000-06-30")
[1] 1
R> mondf(c("2002-03-31", "2002-04-30", "2002-05-31"), "2002-06-30")
[1] 3 2 1
R>
Добавление флага EndOfMonth
оставлено как упражнение для читателя :)
Edit 2: Может быть difftime
оставляет это за бортом, так как нет надежного способа выразить дробную разницу, которая соответствовала бы поведению difftime
для других юнитов.
В списке рассылки R-Help есть такое же сообщение, как и в вашем (ранее я упоминал список CRAN)
Здесь ссылка. Предлагается два решения:
#тестовые данные d1 <- as.Date ("01 марта 1950", "%d %B %Y") d2 <- as.Date(c("01 апреля 1955 года", "01 июля 1980 года"), "%d %B %Y")) # расчёт round((d2 - d1)/(365.25/12)))
seq.Dates
следующим образом:as.Date.numeric <- function(x) structure(floor(x+.001), class = "Date"). sapply(d2, function(d2) length(seq(d1, as.Date(d2), by = "month")))-1