我正在使用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)
这太慢了,我错过了什么吗?我不想保留一份悉尼时报。
感谢。
答案 0 :(得分: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
的含义。