2016-01-29 46 views
0

我有以下的代碼,作品真的很好,從一個Python列表元素的結尾處,刪除字符:R中這個字符串替換代碼的等價物?

x = ['01/01/2013 00:00:00','01/01/2013 00:00:00', 
    '01/01/2013 00:00:00','01/01/2013 00:00:00',...] 

假設數組,我想刪除00:00:00部分。所以,我寫了這個:

i = 0 
while i < len(x): 
    x[i] = x[i][:x[i].find(' 00:00:00')] 
    i += 1 

這樣做的竅門。我如何在R中實現類似的解決方案?我試過substrgsub,但它們運行得非常慢(實際列表中有超過250,000個日期/時間組合)。

+1

你只是想要字符串或解析日期/時間 – rawr

+0

如果你想它作爲一個實際的日期對象,你可以使用'as.Date(x,format ='%d /%m /% Y')'(或''%m /%d /%Y''如果是月/日/年;我說不出來)。 – alistaire

回答

2

嘗試

x <- rep('01/01/2013 00:00:00', 250000) 
system.time(y <- sub(" 00:00:00", "", x, fixed=TRUE)) 
# User  System verstrichen 
# 0.05  0.00  0.05 

y包含結果。時機表明它不應該花太長時間。有關參數的幫助,請參閱?sub

2

考慮一些樣本數據:

set.seed(144) 
dat <- sample(c("01/01/2013 00:00:00", "01/01/2013 12:34:56"), 200000, replace=T) 
table(dat) 
# dat 
# 01/01/2013 00:00:00 01/01/2013 12:34:56 
#    100100    99900 

在這裏,我們要刪除的尾隨00:00:00但保留尾隨12:34:56。

你先在可以用下面的字符串的結尾找到00:00:00(跑〜0.1秒我的電腦上):

to.clean <- grepl(" 00:00:00$", dat) 

現在你可以使用substr移除相關尾隨字符(在運行〜我的電腦上0.04秒):

dat[to.clean] <- substr(dat[to.clean], 1, nchar(dat[to.clean])-9) 
table(dat) 
# dat 
#   01/01/2013 01/01/2013 12:34:56 
#    100100    99900 

可替換地,下面更緊湊gsub命令也運行在約0.15秒這些200000日期/時間對:

cleaned <- gsub(" 00:00:00$", "", dat) 
table(cleaned) 
# cleaned 
#   01/01/2013 01/01/2013 12:34:56 
#    100100    99900 

這有可能是你通過數據循環和單獨的載體,它肯定會被預期要慢得多,因爲它並不需要量化的優勢的每個元素上調用substrgsub

相關問題