두 날짜 사이의 개월 수
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
'Programing' 카테고리의 다른 글
Haskell에서 ()는 정확히 무엇입니까? (0) | 2020.11.26 |
---|---|
MS-Build 2017“Microsoft.WebApplication.targets”가 없습니다. (0) | 2020.11.26 |
CSS 삽입 테두리 (0) | 2020.11.26 |
TortoiseSVN이 인증 세부 정보를 저장하지 않음 (0) | 2020.11.26 |
사용자가 uinavigationcontroller에서 뒤로 버튼을 눌렀는지 확인 하시겠습니까? (0) | 2020.11.26 |