2

文字の日時を非常に効率的に読み取ることができる機能にfasttimeパッケージを使用しています。fastPOSIXct私の問題は、GMT で表現されている文字の日時しか読み取れないことです。

R) fastPOSIXct("2010-03-15 12:37:17.223",tz="GMT") #very fast
[1] "2010-03-15 12:31:16.223 GMT"
R) as.POSIXct("2010-03-15 12:37:17.223",tz="GMT") #very slow
[1] "2010-03-15 12:31:16.223 GMT"

ここで、「アメリカ/モントラル」タイムゾーンで表現された日時を含むファイルがあるとします。計画は、それらをロードし (暗黙のうちに GMT であると偽って)、その後、基になる値を変更せずにタイムゾーン属性を変更することです。

別の投稿で参照されているこの関数を使用する場合:

forceTZ = function(x,tz){   
    return(as.POSIXct(as.numeric(x), origin=as.POSIXct("1970-01-01",tz=tz), tz=tz))
}

バグが発生しています...

R) forceTZ(as.POSIXct("2010-03-15 12:37:17.223",tz="GMT"),"America/Montreal")
    [1] "2010-03-15 13:37:17.223 EDT"

…そうであってほしいから

R) as.POSIXct("2010-03-15 12:37:17.223",format="%Y-%m-%d %H:%M:%OS",tz="America/Montreal")
    [1] "2010-03-15 12:37:17.223 EDT"

回避策はありますか?

編集:私は知ってlubridate::force_tzいますが、遅すぎます(もう使用する必要はありfasttime::fastPOSIXctません)

4

3 に答える 3

4

これは夏時間の問題です: http://www.timeanddate.com/time/dst/2010a.html

2010 年、カナダでは 3 月 14 日に開始されましたが、英国では 3 月 28 日まで開始されませんでした。

オブジェクトを使用POSIXltして、タイムゾーンを直接変更できます。

lt <- as.POSIXlt(as.POSIXct("2010-03-15 12:37:17.223",tz="GMT"))
attr(lt,"tzone") <- "America/Montreal"
as.POSIXct(lt)
[1] "2010-03-15 12:37:17 EDT"

または、 を使用formatして文字列に変換し、 への呼び出しでタイムゾーンを設定することもできますas.POSIXct。したがって、次のように変更できますforceTZ

forceTZ <- function(x,tz)
{
  return(as.POSIXct(format(x),tz=tz))
}


forceTZ(as.POSIXct("2010-03-15 12:37:17.223",tz="GMT"),"America/Montreal")
[1] "2010-03-15 12:37:17 EDT"
于 2013-04-04T16:49:28.320 に答える
1

GMT からのオフセットを修正するために適切な秒数を追加することはできませんか?

# Original problem
fastPOSIXct("2010-03-15 12:37:17.223",tz="America/Montreal")
# [1] "2010-03-15 08:37:17 EDT"

# Add 4 hours worth of seconds to the data. This should be very quick.
fastPOSIXct("2010-03-15 12:37:17.223",tz="America/Montreal") + 14400
# [1] "2010-03-15 12:37:17 EDT"
于 2013-04-11T13:24:24.927 に答える