如何基于小时,分钟,秒来最有效的方式对数据框进行子集化

时间:2015-10-29 13:56:31

标签: r

我正在尝试根据时间对数据框进行子集化:

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"")))
基于时间的子集函数到子集需要很长时间才能完成。有没有更好的方法来做到这一点,最快?

1 个答案:

答案 0 :(得分:3)

您可能需要考虑data.tableITime(基于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