Число месяцев между двумя датами

Существует ли стандартный/распространенный метод/формула для вычисления числа месяцев между двумя датами в R?

Я ищу что-то, что подобно функции месяцев MathWorks

62
задан jogo 8 January 2016 в 21:25
поделиться

2 ответа

Я собирался сказать, что это просто, но 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 для других юнитов.

.
56
ответ дан 24 November 2019 в 16:33
поделиться

В списке рассылки R-Help есть такое же сообщение, как и в вашем (ранее я упоминал список CRAN)

Здесь ссылка. Предлагается два решения:

  • Среднее значение 365,25/12 дней в месяц, поэтому в следующем выражении дается количество месяцев между d1 и d2:
#тестовые данные 
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
14
ответ дан 24 November 2019 в 16:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: