2017-01-30 5 views
1

私は何か非常にばかげていると思うが、の機能がには期待どおりに機能しない。R:lubridateのdst()が期待通りに動作しない

library(lubridate) 

x <- c("2016-01-01", "2016-06-01") 

dst(x) # Returns c(FALSE, TRUE) 
dst(as.Date(x)) # Returns c(FALSE, FALSE) 

どちらの場合でも期待した結果はc(FALSE, TRUE)です。しかし、dstに文字ベクタを渡して、Dateオブジェクトではない場合にのみ、期待される結果が得られます。私はOS Xを使用しています、私の現在のタイムゾーンはPST(America/Los_Angeles)です。

c(NA, FALSE, TRUE)[as.POSIXlt(x)$isdst + 2] 

as.POSIXlt

は、デフォルトでは次のとおりです:

as.POSIXlt(x=, tz="") 

...デフォルトでは、システムのタイムゾーンがかかります

+2

こんにちはpbaylis、あなたが期待している結果を教えてください。 –

+1

'dst(x)'は私のために 'c(FALSE、FALSE)'を返します。あなたは何タイムゾーンですか? 'dst(x)'はシステムタイムゾーンを使う 'as.POSIXlt(x)$ isdst'を呼び出します。 – thelatemail

+0

私は 'c(FALSE、TRUE)'を期待しています。私はPSTにいます(それに応じて編集された質問)。 – pbaylis

答えて

3

dst()は本質的にコードの一部を呼び出します。 L.A.であなたの所在地を確認してみましょう。

as.POSIXlt(x, tz="America/Los_Angeles") 
#[1] "2016-01-01 PST" "2016-06-01 PDT" 
c(NA, FALSE, TRUE)[as.POSIXlt(x, tz="America/Los_Angeles")$isdst + 2] 
#[1] FALSE TRUE 

すべては問題ありません。ハワイ。それでは、as.Date(x)

as.POSIXlt(as.Date(x)) 
#[1] "2016-01-01 UTC" "2016-06-01 UTC" 
as.POSIXlt(as.Date(x), tz="America/Los_Angeles") 
#[1] "2016-01-01 UTC" "2016-06-01 UTC" 

あーで試してみましょう。したがって、as.POSIXltは、Dateオブジェクトでうまく再生されず、ローカルタイムゾーンの代わりに常にUTCを返し、一見tz=引数を無視します。 UTCは夏時間に従わないため、いつもFALSEが返されます。

Rソースコードを見ると、これが当てはまるようです。 https://svn.r-project.org/R/trunk/src/main/datetime.cには、

# R call: 
#> as.POSIXlt.Date 
#function (x, ...) 
#.Internal(Date2POSIXlt(x)) 

# source code: 
#SEXP attribute_hidden do_D2POSIXlt(SEXP call, SEXP op, SEXP args, SEXP env) 
#{ 
#... 
setAttrib(ans, s_tzone, mkString("UTC")); 

...がハードコードされた文字列として表示されます。

+0

ありがとうございます。これは私のバグのようですが、わかりません。 'as.POSIXlt'の[documentation](https://stat.ethz.ch/R-manual/R-devel/library/base/html/as.POSIXlt.html)は、「時間のない日付は存在するものとして扱われます。 UTCの真夜中には「期待された行動かもしれない。 私の回避策は、 'as.character(as.Date(x))'を使用することですが、大きなデータセットがあり、文字ベクトルへの変換にはコストがかかります。 – pbaylis

関連する問題