10

指定された単位で inintervalによって表される時間の長さを取得する最良の方法は何ですか? lubridate私が理解できるのは、次のような面倒なことだけです。

> ival
[1] 2011-01-01 03:00:46 -- 2011-10-21 18:33:44

> difftime(attr(ival, "start") + as.numeric(ival), attr(ival, "start"), 'days')
Time difference of 293.6479 days

(私はこれをhttps://github.com/hadley/lubridate/issues/105に機能リクエストとして追加しました。利用可能なより良い方法がないという仮定の下で-しかし、おそらく誰かがここで知っているでしょう。)

更新- どうやらdifftime関数はこれも処理しません。これが例です。

> (d1 <- as.POSIXct("2011-03-12 12:00:00", 'America/Chicago'))
[1] "2011-03-12 12:00:00 CST"
> (d2 <- d1 + days(1))  # Gives desired result
[1] "2011-03-13 12:00:00 CDT"
> (i2 <- d2 - d1)
[1] 2011-03-12 12:00:00 -- 2011-03-13 12:00:00 
> difftime(attr(i2, "start") + as.numeric(i2), attr(i2, "start"), 'days')
Time difference of 23 hours

/.interval以下で言及するように、これを処理する 1 つの良い方法は、最初に入力を にキャストしない関数を実装することだと思いますperiod

4

4 に答える 4

13

as.duration機能は潤滑剤が提供するものです。間隔クラスは、開始からの秒数として内部的に表されるため、時間数が必要な場合は、単純as.numeric(ival)に 3600 で割るか、または (3600*24) で日を割ることができます。

オブジェクトに関数を適用した実際の例が必要な場合は、の出力を提供する必要がありますdput(ival)。help(duration)送信先のページで作成されたオブジェクトでテストを行いまし?intervalた。

 date <- as.POSIXct("2009-03-08 01:59:59") # DST boundary
 date2 <- as.POSIXct("2000-02-29 12:00:00")
 span <- date2 - date  #creates interval 
 span
#[1] 2000-02-29 12:00:00 -- 2009-03-08 01:59:59 
 str(span)
#Classes 'interval', 'numeric'  atomic [1:1] 2.85e+08
#  ..- attr(*, "start")= POSIXct[1:1], format: "2000-02-29 12:00:00"
 as.duration(span)
#[1] 284651999s (9.02y) 
 as.numeric(span)/(3600*24)
#[1] 3294.583
# A check against the messy method:
difftime(attr(span, "start") + as.numeric(span), attr(span, "start"), 'days')
# Time difference of 3294.583 days
于 2012-01-06T23:41:15.583 に答える
3

ケン、日数で割ると(1)あなたが望むものが得られます。間隔を期間で割った場合、Lubridateは期間を期間に強制しません。(間隔内の全期間の正確な数を見つけるためのアルゴリズムは、間隔を類似の期間数で割ったものを使用する推定から始まりますが、これはあなたが気付いていることかもしれません)。

最終結果は、間隔に収まる期間全体の数です。警告メッセージは、回答から削除される期間の一部があるため、推定値であることをユーザーに警告します。短い周期の倍数に変換しない限り、時計の時刻を変更できないため、小数の周期で数学を行うのは賢明ではありませんが、変換を行うための一貫した方法はありません。たとえば、あなたが言及した日は23時間に相当しますが、他の日は24時間に相当します。あなたは正しい方法を考えています-期間はDST、うるう年などによって引き起こされる変動を尊重する試みですが、それらは全体の単位としてのみこれを行います。

上記の減算の誤差を再現することはできません。それは私のために働くようです。

    three <- force_tz(ymd_hms("2011-03-12 12:00:00"), "") 
    # note: here in TX, "" *is* CST
    (four <- three + days(1))
    > [1] "2011-03-13 12:00:00 CDT"
    four - days(1)
    > [1] "2011-03-12 12:00:00 CST"
于 2012-01-09T19:19:11.210 に答える
3

この質問は非常に古いものですが、この質問は何度も表示されており、今日このようなことをする必要があったときにこのページを見つけたので、更新を追加しています。ではlubridate、次のことができるようになりました。

d1 <- ymd_hms("2011-03-12 12:00:00", tz = 'America/Chicago')
d2 <- ymd_hms("2011-03-13 12:00:00", tz = 'America/Chicago')

(d1 %--% d2)/dminutes(1)
(d1 %--% d2)/dhours(1)
(d1 %--% d2)/ddays(1)
(d1 %--% d2)/dweeks(1)
于 2020-10-05T12:42:10.680 に答える