2013-03-22 84 views
13

我想基於參考和測量日期與源半衰期(以年爲單位)之間的差異來更正源活動。說我有R以年爲單位獲取日期差異(浮點數)

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

,並在我的data.frame具有相同的日期格式塔,例如

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

我可以用lubridate

year(today)-year(ref_date) 
[1] 5 
找到的幾年這些日期之間的數

是否有我可以用來獲得浮點回答的函數today - ref_date = 5.2y,例如?

回答

23

是的,當然,使用difftime()與作爲數字:

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

注意,我們要切換到由52.25縮放周,因爲在計算如─而言位模糊 那裏 - 一個2月29日每四年來一次,但不是每一百分之一等。

所以你必須定義。 difftime()可處理長達數週的所有時間單位。由於非常數「分子」的相同原因,月份不能完成。

+0

謝謝。我假設我可以除以365.25並忽略'單位=星期「 – moadeep 2013-03-22 11:46:07

+1

否,你需要 - 只是玩它看看。單位自動調整,嘗試少於一個的增量,甚至'POSIXct'對象(例如'Sys.time()') – 2013-03-22 12:18:57

+0

而且一週中的數字總是一樣嗎? – sop 2015-06-23 14:04:28

-1

既然你已經使用lubridate包,您可以獲取浮動點用一個簡單的伎倆年數:秒

發現數在一年:

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)) 

你的最後答案爲浮動點的年數會

years_between_dates <- seconds_between_dates/seconds_in_a_year 
1

不是您的問題的確切答案,但在某些情況下從Dirk Eddelbuettel的答案可能會產生小錯誤。

請考慮下面的例子:

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

正確的答案應該是至少5年。

下面的函數(使用lubridate包)將計算兩個日期之間的數的整年:

# 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 
} 

你可以修改它取決於你如何定義的天數來計算分數部分在最後(未完成)的一年。

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

相關問題