2016-09-26 6 views
1

このようなPOSIXオブジェクトの振る舞いは私を困惑させます。私は、同じ日付と時刻を持つ2つのPOSIX日付時刻ベクトル、1つのPOSIXctと他のPOSIXltを作成します。それらは==によって同一であるが、以下に示すように%in%ではない。POSIX日付時刻の奇妙な動作

d.ch = c("2016-09-26 0:00:00", "2016-09-26 1:00:00", "2016-09-26 2:00:00", "2016-09-26 3:00:00", "2016-09-26 4:00:00") 
d1 = strptime(d.ch, format="%Y-%m-%d %H:%M:%S") # POSIXlt 
d3 = seq(from=ISOdatetime(2016,9,26,0,0,0), 
    length.out=5, by="hour") # POSIXct 
d1 == d3 
[1] TRUE TRUE TRUE TRUE TRUE 

しかし

d1 %in% d3 
[1] FALSE FALSE FALSE FALSE FALSE 

なぜ?

+1

'd1'はPOSIXltと思われ、d3はPOSIXctと思われます。おそらく '=='は何らかの暗黙の強制を行っています。 – joran

+0

'attributes(d1)'と 'attributes(d3)'を見てください。 'POSIXlt'クラスは、ベクトルと比べてリストと共通しています。実際、私の理解はPOSIXltの 'l 'が表すものですが、' POSIXct'の 'c'はベクトルを作る' c'関数への参照です。 (もっと技術的な説明があると確信しています) – Benjamin

+0

代わりに 'lubridate'を調べるかもしれません。これは、多くの日付/時刻オブジェクトを一貫させます。 – gregmacfarlane

答えて

2

strptime()の結果をPOSIXctに変換するだけであれば、すべて動作します。

それとも、あまりにもデフォルトでPOSIXctを作成anytime()使用する場合:セット以上anytime()繰り返し処理がプリコーディングされているのでフォーマット

R> library(anytime) 
R> d1 <- anytime(c("2016-09-26 00:00:00", "2016-09-26 01:00:00", 
+ "2016-09-26 02:00:00", "2016-09-26 03:00:00", "2016-09-26 04:00:00")) 
R> d1 
[1] "2016-09-26 00:00:00 CDT" "2016-09-26 01:00:00 CDT" "2016-09-26 02:00:00 CDT" 
[4] "2016-09-26 03:00:00 CDT" "2016-09-26 04:00:00 CDT" 
R> d3 <- seq(from=ISOdatetime(2016,9,26,0,0,0), length.out=5, by="hour") # POSIXct 
R> d3 
[1] "2016-09-26 00:00:00 CDT" "2016-09-26 01:00:00 CDT" "2016-09-26 02:00:00 CDT" 
[4] "2016-09-26 03:00:00 CDT" "2016-09-26 04:00:00 CDT" 
R> d1 == d3 
[1] TRUE TRUE TRUE TRUE TRUE 
R> d1 %in% d3 
[1] TRUE TRUE TRUE TRUE TRUE 
R> 

を、私は通常のようにそれを作るためにあなたの時間形式にゼロを追加する必要がありましたISOタイム形式。

(ああ、CDTは私のタイムゾーンであることを起こる。)

+0

すごくうまくいく「いつでも」を提案してくれてありがとう。しかし、これはPOSIXltとPOSIXctが実際には互換性がないことを伝えているようです。これは厄介です。 – horaceT

+0

いいえ、それを見るのは良い方法ではありません。 'help(DateTimeClasses)'を読んでください。私は 'POSIXlt'をコンポーネントへのアクセスを与える_list型と考え、data.framesやxtsインデックスなどの単一の列に適した' POSIXct'を_compact type_として考えます。それらは同じ基礎となる情報の異なる表現ですが、 _デザインによっては違います。あなたがあなたの質問で試みたことをすることはできません。 –

+0

私はちょうどいつ日付タイプを使用するかについての手引きを求める別の質問を掲示しました。 POSIXのセマンティクスを詳しく教えてください。 – horaceT

2

仮想POSIXtクラスから両方POSIXctPOSIXlt継承。つまり、あるオブジェクトがPOSIXctであり、もう1つがPOSIXltである場合、==,+-などのバイナリ演算子が動作することが可能になります。これらのバイナリ関数は引数のクラスを調べます。

%in%matchを呼び出します。これはテーブルから値を検索します。 POSIXt仮想クラスを利用するS3メソッドディスパッチはないので、FALSEというベクトルが得られます。

+0

S3メソッドを追加して 'POSIXt'クラスで' match'を動作させる予定はありますか? – horaceT

+0

Rコアにお問い合わせください。彼らだけが知っているだろう。 –

関連する問題