2017-08-10 62 views
1

也许我在过度工程这个,但我建立一个功能,根据列输入数自动解析日期列。解析日期时间适用,返回数字而不是日期对象

数据:

CreatedDate    LastModifiedDate 
2015-11-20T19:46:11.000Z 2015-11-20T19:46:11.000Z 
2015-11-21T02:54:54.000Z 2015-12-01T18:48:07.000Z 
2015-11-21T14:36:32.000Z 2015-11-21T14:36:32.000Z 
2015-11-21T16:03:41.000Z 2015-11-21T16:03:41.000Z 
2015-11-21T17:31:43.000Z 2015-11-21T17:55:13.000Z 




require(lubridate) 
require(magrittr 

parse_sf_hms <- function(subset) { 
    if(is.null(ncol(subset))){ 
    subset %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y") -> x 
    return(x) 
    } else { 
    apply(subset, 2, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
    return(x) 
    } 
} 

所以,问题是,当我使用一列(如df[,1]df[,c(CreatedDate)]),函数正确返回:

[1] "2015-11-20" "2015-11-21" "2015-11-21" "2015-11-21" 
[5] "2015-11-21" 

但是,当我使用超过一列(例如,df[,c(1,2)]df[,c('CreatedDate','LastModifiedDate')],而是我得到:

 CreatedDate LastModifiedDate 
[1,]  16759   16759 
[2,]  16760   16770 
[3,]  16760   16760 
[4,]  16760   16760 
[5,]  16760   16760 

为什么单个向量在格式中正确地返回日期值,而apply却没有?在这里lapply,rbind会更好吗? 只是试图了解行为。

+5

不要使用'申请(子集2,FUN)'因为它使一切都是一个矩阵,它将你的日期强制转换回数字。改用'lapply(subset,FUN)'。 – thelatemail

+0

感谢@thelatemail - 这回答了我关于行为问题最重要的部分。 – gscott

回答

3

试试这个:

parse_sf_hms <- function(subset) { 
    if(is.null(ncol(subset))){ 
    subset %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y") -> x 
    return(x) 
    } else { 
    x <- lapply(subset, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
    return(x) 
    } 
} 

正如thelatemail说,使用lapply。此外,还有在你的函数的错误..这样的:

apply(subset, 2, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
需求

被分配到x

x <- lapply(subset, function(x) x %>% ymd_hms(tz="America/New_York",quiet=TRUE) %>% as.Date(format="%m/%d/%Y")) 
相关问题