16

私はPOSIXctオブジェクトを持っていて、tzそれを解釈するために R なしで属性を変更したいと考えています (日時が画面に表示される方法を変更することを意味すると解釈します)。

いくつかの背景: 私はfasttimeS.Urbanek のパッケージを使用しています。これは、文字列を取得してPOSIXct非常に迅速にキャストします。問題は、文字列が「GMT」の日時を表す必要があり、私のデータには当てはまらないことです。

でタイムゾーンを変更すると、実際にはのPOSIXctオブジェクトになりますtz=GMTtz=GMT+1

attr(datetime, "tzone") <- "Europe/Paris";
datetime  <- .POSIXct(datetime,tz="Europe/Paris"); 

次に、「表示」されますGMT+2(基になる値は変更されません)。

編集:これは例です

datetime=as.POSIXct("2011-01-01 12:32:23.234",tz="GMT")
attributes(datetime)
#$tzone
#[1] "GMT"
datetime
#[1] "2011-01-01 12:32:23.233 GMT"

R を使用せずにこの属性を変更して解釈するにはどうすればよいですか? どうすれば tzone を変更しても datetime を として表示できます"2011-01-01 12:32:23.233"か?

EDIT/SOLUTION、@GSeeのソリューションはかなり高速で、lubridate::force_tzは非常に遅いです

datetime=rep(as.POSIXct("2011-01-01 12:32:23.234",tz="GMT"),1e5)
f <- function(x,tz) return(as.POSIXct(as.numeric(x), origin="1970-01-01", tz=tz))
> system.time(datetime2 <- f(datetime,"Europe/Paris"))
   user  system elapsed 
   0.01    0.00    0.02 
> system.time(datetime3 <- force_tz(datetime,"Europe/Paris"))
   user  system elapsed 
   5.94    0.02    5.98 
identical(datetime2,datetime3)
[1] TRUE
4

3 に答える 3

14

tz変数の属性を変更するPOSIXctために、文字または数値に変換してから に戻すことはベスト プラクティスではありませんPOSIXct。代わりに、パッケージのforce_tz機能を使用できますlubridate

library(lubridate)

datetime2 <- force_tz(datetime, tzone = "CET")
datetime2
attributes(datetime2)
于 2013-03-22T17:06:59.373 に答える
13

編集:

origin私の以前の解決策は、文字値を(ie )に渡すことでしたorigin="1970-01-01"。R-devel で修正されたバグ ( #PR14973 )のため、ここでのみ機能しました。

origin文書化されているようにではなく、呼び出しの引数をPOSIXct使用するように強制されていました。ドキュメントと一致するように動作が変更されました。この場合、と呼び出しの両方にタイムゾーンを指定する必要があります。tzas.POSIXct"GMT"originas.POSIXct

datetime
#[1] "2011-01-01 12:32:23.233 GMT"
as.POSIXct(as.numeric(datetime), origin=as.POSIXct("1970-01-01", tz="Europe/Paris"),
           tz="Europe/Paris")
#[1] "2011-01-01 12:32:23.233 CET"

これは、古いバージョンの R でも機能します。

于 2013-03-22T17:09:33.140 に答える