Programing

두 날짜 사이의 개월 수

lottogame 2020. 11. 26. 07:43
반응형

두 날짜 사이의 개월 수


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> 

맞아 보인다. 이것을 간단한 클래스 구조로 감쌀 수 있습니다. 또는 해킹으로 남겨주세요 :)

편집 : 또한 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깃발을 추가하는 것은 독자에게 연습으로 남겨 둡니다. :)

편집 2 : 아마도 difftime과 일치 될 부분 차이를 표현하는 더 신뢰할 수있는 방법이 없기 때문에 그것을 밖으로 잎 difftime다른 단위 동작.


간단한 기능 ...

elapsed_months <- function(end_date, start_date) {
    ed <- as.POSIXlt(end_date)
    sd <- as.POSIXlt(start_date)
    12 * (ed$year - sd$year) + (ed$mon - sd$mon)
}

예...

>Sys.time()
[1] "2014-10-29 15:45:44 CDT"
>elapsed_months(Sys.time(), as.Date("2012-07-15"))
[1] 27
>elapsed_months("2002-06-30", c("2002-03-31", "2002-04-30", "2002-05-31"))
[1] 3 2 1

나에게는이 문제를 단순히 두 개의 날짜를 빼는 것으로 생각하는 것이 합리적이며, minuend − subtrahend = difference(wikipedia) 이후 매개 변수 목록에서 나중 날짜를 먼저 넣습니다.

음수를 빼는 규칙 덕분에 1900 년 이전의 날짜에 대해 내부적으로 연도를 음수로 표현 했음에도 불구하고 잘 작동합니다.

> elapsed_months("1791-01-10", "1776-07-01")
[1] 174

더 간단한 방법이있을 수 있습니다. 함수는 아니지만 한 줄뿐입니다.

length(seq(from=date1, to=date2, by='month')) - 1

예 :

> length(seq(from=Sys.Date(), to=as.Date("2020-12-31"), by='month')) - 1

생성 :

[1] 69

두 날짜 사이의 전체 개월 수를 계산합니다. 현재 월 / 월 전체가 아닌 나머지를 포함하려면 -1을 제거하십시오.


이것은 MathWorks 기능과의 패리티 측면에서 묻는 질문에 더 가까운 답변이라고 생각합니다.

MathWorks 월 기능

MyMonths = months(StartDate, EndDate, EndMonthFlag)

내 R 코드

library(lubridate)
interval(mdy(10012015), today()) %/% months(1)

출력 (코드가 2016 년 4 월에 실행되었을 때)

[1] 6

Lubridate [package] 는 날짜를 더 쉽게 분석하고 조작 할 수있는 도구를 제공합니다. 이러한 도구는 공통 목적에 따라 아래에 그룹화되어 있습니다. 각 기능에 대한 자세한 정보는 도움말 문서에서 찾을 수 있습니다.

interval {lubridate} 는 지정된 시작 날짜와 종료 날짜를 사용하여 Interval 클래스 개체를 만듭니다. 시작 날짜가 종료 날짜 이전 인 경우 간격은 양수입니다. 그렇지 않으면 음수가됩니다.

오늘 {윤활유} 현재 날짜

months {Base} 월 추출 다음은 일반적인 함수입니다. 내부 날짜-시간 클래스에 대한 메서드가 여기에 설명되어 있습니다.

% / % {base} 는 정수 나눗셈 AKA를 나타냅니다 (x % / % y) (반올림 오류까지)


R-Help 메일 링 목록에 귀하와 같은 메시지가 있습니다 (이전에 CRAN 목록을 언급했습니다).

여기 에 링크가 있습니다. 두 가지 권장 솔루션이 있습니다.

  • 월 평균 365.25 / 12 일이 있으므로 다음 식은 d1과 d2 사이의 월 수를 나타냅니다.
#test data 
d1 <- as.Date("01 March 1950", "%d %B %Y")    
d2 <- as.Date(c("01 April 1955", "01 July 1980"), "%d %B %Y")
# calculation 
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

library(lubridate)

case1 : 순진한 기능

mos<-function (begin, end) {
      mos1<-as.period(interval(ymd(begin),ymd(end)))
      mos<-mos1@year*12+mos1@month
      mos
}

case2 : '일'에 관계없이 '월'만 고려하면되는 경우

mob<-function (begin, end) {
      begin<-paste(substr(begin,1,6),"01",sep="")
      end<-paste(substr(end,1,6),"01",sep="")
      mob1<-as.period(interval(ymd(begin),ymd(end)))
      mob<-mob1@year*12+mob1@month
      mob
}

예 :

mos(20150101,20150228) # 1
mos(20150131,20150228) # 0
# you can use "20150101" instead of 20150101

mob(20150131,20150228) # 1
mob(20150131,20150228) # 1
# you can use a format of "20150101", 20150101, 201501

library(lubridate)
date1 = "1 April 1977"
date2 = "7 July 2017"

date1 = dmy(date1)
date2 = dmy(date2)
number_of_months = (year(date1) - year(date2)) * 12 + month(date1) - month(date2)

월 차이 = 12 * 년 차이 + 월 차이.

ifelse월 공제 조건을 사용하여 다음을 수정해야 할 수 있습니다.


나를 위해 이것은 효과가 있었던 것입니다.

library(lubridate)

Pagos$Datediff <- (interval((Pagos$Inicio_FechaAlta), (Pagos$Inicio_CobFecha)) %/% months(1))

출력은 두 날짜 사이의 개월 수이며 Pagos 데이터 프레임의 열에 저장됩니다.


월별 날짜 차이

$date1 = '2017-01-20';
$date2 = '2019-01-20';

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);

$month1 = date('m', $ts1);
$month2 = date('m', $ts2);

echo $joining_months = (($year2 - $year1) * 12) + ($month2 - $month1);

짧고 편리한 또 다른 방법은 다음과 같습니다.

day1 <- as.Date('1991/04/12')
day2 <- as.Date('2019/06/10')
round(as.numeric(day2 - day1)/30.42)

[1] 338

참고URL : https://stackoverflow.com/questions/1995933/number-of-months-between-two-dates

반응형