2017-02-15 91 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) 
相關問題