我正在尝试根据时间对数据框进行子集化:
df
Hostname Date cpu
Server101 1/1/2015 00:00:00 10
Server101 1/1/2015 00:00:00 10
Server101 1/1/2015 08:00:00 10
Server101 1/1/2015 06:00:00 10
我需要从09:00:00到17:00:00抓取数据
所以这就是我所做的:
library(lubridate)
df<-transform(df, time= format(df$Date,'%H:%M:%S'))
df$time<-times(df$time)
df<-subset(df, time>times(c("09:00:00")) & time<times(c("17:00:00"")))
基于时间的子集函数到子集需要很长时间才能完成。有没有更好的方法来做到这一点,最快?
答案 0 :(得分:3)
您可能需要考虑data.table
类ITime
(基于POSIXlt
)。这可能是最快的选择:
数据:
df <- read.table(header=T, text="Hostname Date cpu
Server101 '1/1/2015 00:00:00' 10
Server101 '1/1/2015 00:00:00' 10
Server101 '1/1/2015 08:00:00' 10
Server101 '1/1/2015 10:00:00' 10")
解决方案:
library(data.table)
df$Date <- as.POSIXct(df$Date, format='%d/%m/%Y %H:%M:%S')
#setDT coverts the df to a data.table
#as.ITime converts the date to an ITime class
#in the last chain you subset the data table
setDT(df)[,time:=as.ITime(Date)][time>=as.ITime('09:00:00') & time<=as.ITime('17:00:00')]
在您的示例数据集上(刚刚更改了最后一行以获得结果):
setDT(df)[,time:=as.ITime(Date)][time>=as.ITime('09:00:00') & time<=as.ITime('17:00:00')]
Hostname Date cpu time
1: Server101 2015-01-01 10:00:00 10 10:00:00