2014-09-02 43 views
0

我有一些数据帧,DF与列的日期是按以下格式的字符:消除不在R中的日期

pv$day 
    01/01/13 00:00:00 
    03/01/13 00:02:03 
    04/03/13 00:10:15 

.... 

我想消除时间戳,刚刚离开日期(例如,第一行的01/01/13)。我曾尝试使用sapply()来应用strsplit()函数,并试图使用正则表达式来过滤内容,但在两种情况下似乎都没有完全正确。这:

sapply(pv$day, function(x) strsplit(toString(x), ' ')) 

给我用正确的拆分列,但索引有两种[1][[1]]不返回分割的第一个元素。

什么是最好的方式去做这件事?

回答

2

您可以使用sub

vec <- c("01/01/13 00:00:00", "03/01/13 00:02:03", "04/03/13 00:10:15") 

sub(" .+", "", vec) 
# [1] "01/01/13" "03/01/13" "04/03/13" 
2

一个简单的,灵活的解决方案是使用strptime和strftime。下面是一个使用日期从上面的例子为例:

# Your dates 
t <- c("01/01/13 00:00:00","03/01/13 00:02:03", "04/03/13 00:10:15") 

# Convert character strings to dates 
z <- strptime(t, "%d/%m/%y %H:%M:%OS") 

# Convert dates to string, omitting the time 
z.date <- strftime(z,"%d/%m/%y") 

# Print the first date 
z.date[1] 
1

下面是使用sapply一个很好的方法,它使用strsplit在空间分割

> d <- c("01/01/13 00:00:00", "03/01/13 00:02:03", "04/03/13 00:10:15") 
> sapply(strsplit(d, " "), `[`, 1) 
# [1] "01/01/13" "03/01/13" "04/03/13" 

而且还可以使用stringr::word如果你只是想要一个人物矢量。

> library(stringr) 
> word(d) 
# [1] "01/01/13" "03/01/13" "04/03/13" 
+1

我不认为它有效... – 2014-09-02 19:07:07

+0

这似乎得到了预期格式'格式(as.Date(d,format =“%d /%m /%y”),“%d /%m /%y“)#[1]”01/01/13“”03/01/13“”04/03/13“' – akrun 2014-09-02 19:14:48

+0

好的,我们很好去 – 2014-09-02 19:18:26

0

下面是使用断言周围一看的方法:

vec <- c("01/01/13 00:00:00", "03/01/13 00:02:03", "04/03/13 00:10:15") 
gsub(pattern = "(?=00).*$", replacement = "", vec, perl = TRUE) 
[1] "01/01/13 " "03/01/13 " "04/03/13 " 

模式看在与双00开始的字符串的结尾东西,并将其删除。