3

私はdata.tableパッケージを使用しており、これを使用しました:

dt$date<- as.POSIXct(dt$date, tz="GMT")      (I know I can use fastPOSIXct)
2009-08-07 06:00:14
2009-08-07 06:00:15
2009-08-07 06:00:16 
2009-08-07 06:00:24

タイムゾーンを変えて(いろいろありますが)時間を抽出したいです。apply 関数を使用するとします。

f <- function(x) {
  SydneyTime<-format(x["date"], format = "%Y-%m-%d %H:%M:%OS", tz = "Australia/Sydney")
  Sy<-hour(SydneyTime)
  return(Sy)
}

mydata$SyHour <- apply(dt, 1, f)

これは遅すぎます。何か不足していますか? SydneyTime のコピーを保持したくありません。

ありがとう。

4

1 に答える 1

4

何もコピーする必要はありません。ベクトル化されているため、元の列のデータを使用して新しい列を作成format.Dateできます。再現可能な小さな例を次に示します。:=data.table

require( data.table )
#  Seconds in the day
n <- 86400

#  Make some data
DT <- data.table( Date = as.POSIXct( Sys.time()+seq(0,2*n,by=n) , tz = "GMT") )
#                  Date
#1: 2013-08-28 21:17:10
#2: 2013-08-29 21:17:10
#3: 2013-08-30 21:17:10

#  Change the TZ
DT[ , Date2:=format( Date , tz = "Australia/Sydney")]
#                  Date               Date2
#1: 2013-08-28 21:17:10 2013-08-29 06:17:10
#2: 2013-08-29 21:17:10 2013-08-30 06:17:10
#3: 2013-08-30 21:17:10 2013-08-31 06:17:10

以下のコメントに関連する編集

lapplyと一緒に列単位で使用するように設計されていますdata.table。列Dateをインプレースで変更するには、次のようにします。

DT[ , lapply( .SD , format , tz = "Australia/Sydney" ) ]

ただし、実際のデータでこれを使用する前に、.SDとの意味を確認してください。.SDcols

于 2013-08-28T20:19:08.197 に答える