17

私はいくつかのPOSIXltDateTime オブジェクトを操作しています。たとえば、1 時間を追加したいとします。

my.lt = as.POSIXlt("2010-01-09 22:00:00")
new.lt = my.lt + 3600
new.lt
# [1] "2010-01-09 23:00:00 EST"
class(new.lt)
# [1] "POSIXct" "POSIXt" 

事は私がオブジェクトになりたいということnew.ltですPOSIXltas.POSIXltに戻すために使用できることはわかっていますPOSIXltが、これを達成するためのよりエレガントで効率的な方法はありますか?

4

4 に答える 4

16

POSIXct分類されたオブジェクトは、内部的に数値計算を可能にする数値です。POSIXlt-objects は内部的にリストです。残念ながら、Ops.POSIXt(「+」を使用すると呼び出される)次のコードで POSIXct を強制します。

if (inherits(e1, "POSIXlt") || is.character(e1)) 
        e1 <- as.POSIXct(e1)

幸いなことに、1 時間だけしたい場合は、3600 を追加する代わりに便利な方法があります。代わりに、リスト構造を使用して、hour 要素に 1 を追加します。

> my.lt$hour <- my.lt$hour +1
> my.lt
[1] "2010-01-09 23:00:00"

このアプローチは、DST の変更に関する厄介な質問を避けたい場合、少なくとも日を追加して同じ時刻を取得したい場合に非常に便利です。

Ops.POSIXlt編集 (時間の「オーバーフロー」に注意することを示す @sunt のコードを追加します。))

my.lt = as.POSIXlt("2010-01-09 23:05:00") 
my.lt$hour=my.lt$hour+1 
my.lt
# [1] "2010-01-10 00:05:00"
于 2012-01-13T21:28:02.517 に答える
13

短い答え: いいえ

長い答え:

POSIXctオブジェクトは、POSIXltより一般的なクラスの 2 つの特定のタイプですPOSIXt(厳密なオブジェクト指向の継承の意味ではなく、準オブジェクト指向の実装の意味で)。コードはこれらを自由に切り替えます。オブジェクトに追加する場合POSIXlt、実際に使用される関数は であり+.POSIXt、 に特化した関数ではありませんPOSIXlt。この関数内で、引数は a に変換されてPOSIXctから処理 (追加) されます。

さらに、POSIXct特定の日時からの秒数です。POSIXltは日付の部分 (秒、分、時間、日、月、年、曜日、日、DST 情報) のリストであるため、それに直接追加しても意味がありません。それを秒数 ( ) に変換し、それにPOSIXct加算することは理にかなっています。

于 2012-01-13T21:27:16.883 に答える
9

それほどエレガントではないかもしれませんが、

seq.POSIXt( from=Sys.time(), by="1 hour", length.out=2 )[2]

私見はより説明的です

Sys.time()+3600;  # 60 minutes * 60 seconds

コード自体は、「POSIX」「シーケンス」を「1時間」ずつ増加させることを文書化していますが、それは好みの問題です。POSIXlt で問題なく動作しますが、どちらの方法でも POSIXct を返すことに注意してください。「日」でも機能します。月、夏時間などの処理方法の詳細については、help(seq.POSIXt) を参照してください。

于 2014-04-18T04:27:34.637 に答える
6

?POSIXltあなたにそれを伝えます:

2つの日時クラス間を移動する必要がある変換には、タイムゾーンが必要です。「POSIXlt」から「POSIXct」への変換は、選択したタイムゾーンの時刻を検証します。

POSIXltしたがって、3600はオブジェクトではなく、自動変換があると思います。

私は単純に固執します:

new.lt = as.POSIXlt(my.lt + 3600)
class(new.lt)
[1] "POSIXlt" "POSIXt"

as.POSIXlt時間操作の前に追加するのはそれほど面倒ではありません。

于 2012-01-13T21:26:39.747 に答える