web-dev-qa-db-ja.com

365日が80000年に等しいのはなぜですか?

lubridateintervalがあり、日数を整数で取得したいと考えています。ただし、次の奇妙な中間結果が得られます。

library("lubridate")
i1 <- interval("2015-01-01 00:00:00", "2016-01-01 00:00:00")
i1 <- interval(ymd_hms("2015-01-01 00:00:00"), ymd_hms("2016-01-01 00:00:00")) # Gives the same result
duration(i1)
# [1] "31536000s (~365 days)"
duration(i1, units = "days")
# [1] "2724710400000s (~86340.86 years)"

これが2つの実用的なショートカットです。後者は「間隔を継続時間に強制する」というメッセージをスローします(そしてその理由はわかりません...)

> as.numeric(as.duration(i1), units = "days")
[1] 365
> as.numeric(i1, units = 'days')

(2016年5月3日付けのRバージョン3.3.0、潤滑バージョン1.5.6)

22
Christoph

units引数の意味を誤解しています。ドキュメントから、

units numが参照する単位のタイプを指定する文字列。

ここで、numは最初の引数です。そう

duration(i1)

と同等です

duration(i1, units = "seconds")

しかしながら、

duration(i1, units = "days")

という意味です i1daysで測定されます。したがって、非常に大きな数です。

27
csgillespie

メンテナによる

[durationオブジェクトでintervalを使用する]は禁止する必要があります。変換にはas.durationを使用します。

さらに、上記のコードのバグは、関数呼び出しを禁止することで修正されました。

> duration(i1)
Error in .duration_from_num(num, units) :
  First argument to `duration` constructor must be character or numeric. Supplied object of class 'Interval'
> as.duration(i1)
[1] "31536000s (~52.14 weeks)"
9
Konrad Rudolph