2013-03-22 5 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などですか?数値と

答えて

23
はい、もちろん、使用

difftime():我々はカウントyears-の面であいまいさが のビットがあるよう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()は、すべての時間単位を数週間処理します。非定数「分子」と同じ理由で月を実行することはできません。

+0

ありがとうございました。私は365.25で割り切れ、 'unit = weeks 'を省略することができると仮定します。 – moadeep

+1

いいえ、あなたはそれを見るだけで遊ぶ必要があります。ユニットは自動的に調整され、1未満のデルタで試します。 –

+0

週はいつも1年で同じ数字ですか? – sop

-1

すでにlubridateパッケージを使用しているので、簡単なトリック使って浮動小数点に年の数を取得することができます。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年以上でなければなりません。

lubridateパッケージを使用して)次の関数は、2つの日付の間の完全な年の数を計算します:

# 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を見つけることができます。

関連する問題