2013-03-22 2 views
13

참조 및 측정 날짜와 소스 반감기 (년 단위로 측정)의 차이를 기반으로 소스 작업을 수정하려고합니다. 나는 내가 lubridate 패키지R 날짜 차이 (부동 소수점)

year(today)-year(ref_date) 
[1] 5 
를 사용하여 이러한 날짜 사이 년간의 번호를 찾을 수 있습니다

today <- as.Date(Sys.Date(), format='%d/%m/%y') 

예를 들어

ref_date <- as.Date('06/01/08',format='%d/%m/%y') 

과 같은 날짜 형식 내 data.frame의 열을, 말해봐

부동 소수점 응답을 얻는 데 사용할 수있는 함수가 있습니까? 예 : today - ref_date = 5.2y? AS를 숫자로

답변

23
네, 물론, 사용

difftime() : 우리가 계산 년 -의 관점에서 모호 의 비트가 존재하는 한 52.25로 조정 주로 전환해야합니까

R> as.numeric(difftime(as.Date("2003-04-05"), as.Date("2001-01-01"), 
+      unit="weeks"))/52.25 
[1] 2.2529 
R> 

주 - 2 월 29 일은 매 4 년마다 나옵니다.하지만 매 100 회마다 오는 것은 아닙니다.

이렇게 정의해야합니다. difftime()은 최대 주 단위로 처리합니다. 일정하지 않은 '분자'와 같은 이유로 월을 수행 할 수 없습니다. 일 년 초

찾기 수 : 이미 lubridate 패키지를 사용하고 있기 때문에

+0

감사합니다. 나는 365.25로 나누고'unit = weeks '를 생략 할 수 있다고 가정합니다. – moadeep

+1

아니요,보기 만하면됩니다. 단위가 자동 조정되거나 1보다 작은 델타로 시도하거나 POSIXct 객체 (예 :'Sys.time()'에서) –

+0

그리고 일주일은 항상 같은 숫자입니까? – sop

-1

, 당신은 간단한 트릭을 사용하여 부동 소수점에서 몇 년의 수를 얻을 수 있습니다

seconds_in_a_year <- as.integer((seconds(ymd("2010-01-01")) - seconds(ymd("2009-01-01")))) 

지금 초 수를 얻을 수 2 날짜 사이에 당신은

될 것 부동 포인트 년간의 번호를

seconds_between_dates <- as.integer(seconds(date1) - seconds(date2)) 

당신의 최종 답변을 원하는

1

질문에 대한 정확한 대답은 아니지만, 경우에 따라 Dirk Eddelbuettel의 대답은 약간의 오류가 발생할 수 있습니다.

는, 다음의 예를 고려해보십시오 :

as.numeric(difftime(as.Date("2012-03-01"), as.Date("2017-03-01"), unit="weeks"))/52.25 
[1] -4.992481 

여기에 정답은 5 년 이상이어야한다.

# Function to calculate an exact full number of years between two dates 
year.diff <- function(firstDate, secondDate) { 
    yearsdiff <- year(secondDate) - year(firstDate) 
    monthsdiff <- month(secondDate) - month(firstDate) 
    daysdiff <- day(secondDate) - day(firstDate) 

    if ((monthsdiff < 0) | (monthsdiff == 0 & daysdiff < 0)) { 
    yearsdiff <- yearsdiff - 1 
    } 

    yearsdiff 
} 

당신은 당신이 일 수를 정의하는 방법에 따라 소수 부분을 계산하기 위해 수정할 수 있습니다 : 두 날짜 사이의 전체 년의 수를 계산합니다 (lubridate 패키지를 사용)

다음 기능 마지막 (완료되지 않은) 해에.

1

lubridate 패키지는이 작업을 수행 할 수 있습니다 내장 함수, TIME_LENGTH가 포함되어 있습니다.lubridate 패키지

time_length(difftime(as.Date("2003-04-05"), as.Date("2001-01-01")), "years") 
[1] 2.257534 

time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years") 
[1] 5.00274 

문서는 here을 찾을 수 있습니다.

관련 문제