2017-02-15 75 views
0

我有一个包含500万行和更多行的数据集,我想从两列创建时间戳,一列使用日期,另一列使用时间值。从日期和时间列中快速创建data.table中的时间戳列

当我使用fread()函数将csv读入R时,所有列都是字符格式,因此我使用data.table将它们转换为相关格式,这对于那种事情来说非常快:

nf[, (dcols):= lapply(.SD,ymd),.SDcols=dcols] #using the ymd() function from lubridate to change date columns 

我的下一个步骤是创建一个时间戳,我在下面的方式做:

nf[,start_timestamp := as.POSIXct(paste(start_date,start_time))] 

如果我解决此函数调用运行Sys.Time(),我得到的3.843分钟一个时间差。这是一段等待,所以我想知道是否有人可以建议一个基于data.table的解决方案,这将允许我更快地将这两列组合成一个时间戳?

+1

你应该做一个重复的例子,更快速地创建时间戳:一些可用的数据,N'的'功能和'nc'(行和列)以及适当的库调用。 Data.table包含一些日期时间功能,但它涉及将日期和时间保留在单独的列中。参见'IDateTime'。 – Frank

+1

请参阅[本](http://stackoverflow.com/a/12898544/3001626)。我的猜测是'as.POSIXct'是你的瓶颈。另外,我不确定你在用什么'ymd'。 –

+0

@DavidArenburg我认为'as.POSIXct'一定是瓶颈。我使用'ymd'将日期格式从字符更改为日期 - 我发现它比'as.Date'快。 @Frank - 我将创建一些示例数据并编辑原始帖子。 –

回答

0

您可以通过使用fastPOSIXct功能从fasttime

Sample data

library(data.table) 
library(fasttime) 
library(lubridate) 

ttfile <- "timestamp_test_data.csv" 

tt <- read.table(ttfile, header = TRUE, stringsAsFactors = FALSE, sep=",",na.strings=c("NA","N/A","null")) 

dcols <- c('start_date','end_date') 
tcols <- c('start_time','end_time') 

setDT(tt) #convert to data.table 

tt[, (dcols):= lapply(.SD,mdy),.SDcols=dcols] # := updates the data table in place, no need to pass it to another vector 
tt[, (tcols):= lapply(.SD,as.ITime),.SDcols=tcols] 

tt[,start_timestamp := fastPOSIXct(paste(start_date,start_time - 3600))] #remove number of seconds in an hour to fix fastPOSIXct adding an hour to the timestamp - if it doesn't do that for you, just remove that part 
tt[,end_timestamp := fastPOSIXct(paste(end_date,end_time - 3600))] 

str(tt)