lubridate解析字符串向量导致今天的日期

时间:2014-10-17 08:50:47

标签: r lubridate

我有一种情况,我有很多维度表,其中一些包含日期属性,通常是ymd或ymd_hms,如字符串。我的目标是将所有日期变量重新格式化为Date类。由于有很多维度表,我决定将它们放在data.frames列表中,然后只循环遍历每一个维度表,用lubridate包中的ymd_hms函数解析维度data.frames的每一列,并选择那些正确解析并放入的列他们回到我原来的维度表。

但是,它发生了

ymd_hms(., truncated = 3)也成功解析了一些根本不应解析的data.frame列......它们只是分类变量(存储为字符)。下面我提供一个例子。

library(dplyr)
library(lubridate)

my_test_df <- 
    structure(list(naziv.x = c("NI PODATKA", "TUJINA", "GRAD", 
                           "LJUBLJANA", "CELJE", "VELIKA POLANA"),
               datsp.x = c("2010-01-13 15:28:00", "2008-05-22 14:48:00",
                           "2007-03-29 12:14:00", "2007-03-29 12:14:00",
                           "2007-03-29 12:14:00", "2007-03-29 12:14:00")), 
          .Names = c("naziv.x",
                     "datsp.x"), 
          class = "data.frame", 
          row.names = c(NA, 6L))

这是我的data.frame:

        naziv.x             datsp.x
1    NI PODATKA 2010-01-13 15:28:00
2        TUJINA 2008-05-22 14:48:00
3          GRAD 2007-03-29 12:14:00
4     LJUBLJANA 2007-03-29 12:14:00
5         CELJE 2007-03-29 12:14:00
6 VELIKA POLANA 2007-03-29 12:14:00

这是我的代码,应该只成功解析第二列:

my_test_df %>%
    mutate_each(funs(as.Date(ymd_hms(., truncated = 3))))

但它会导致下面的data.frame:

     naziv.x    datsp.x
1 2014-10-17 2010-01-13
2 2014-10-17 2008-05-22
3 2014-10-17 2007-03-29
4 2014-10-17 2007-03-29
5 2014-10-17 2007-03-29
6 2014-10-17 2007-03-29

为什么会这样?

我的sessionInfo如下:

R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Slovenian_Slovenia.1250  LC_CTYPE=Slovenian_Slovenia.1250    LC_MONETARY=Slovenian_Slovenia.1250 LC_NUMERIC=C                       
[5] LC_TIME=Slovenian_Slovenia.1250    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.3.0.2   lubridate_1.3.3

loaded via a namespace (and not attached):
 [1] assertthat_0.1 DBI_0.3.1      digest_0.6.4   lazyeval_0.1.9 magrittr_1.0.1 memoise_0.2.1  parallel_3.1.1 plyr_1.8.1     Rcpp_0.11.3   
[10] stringr_0.6.2  tools_3.1.1  

1 个答案:

答案 0 :(得分:1)

您可以使用matchesstarts_withends_withnum_rangecontains等来指定要应用该功能的列名称。如果您没有多列,只需使用列名称即可。我想没有指明任何东西,它会转到默认值即。 everything并应用该功能。由于某些原因,在这种情况下,不date格式的列naziv.x获取今天的日期。我不知道这是不是一个错误。

 my_test_df %>%
          mutate_each(funs(as.Date(ymd_hms(., truncated = 3))), starts_with("datsp"))
 #        naziv.x    datsp.x
 #1    NI PODATKA 2010-01-13
 #2        TUJINA 2008-05-22
 #3          GRAD 2007-03-29
 #4     LJUBLJANA 2007-03-29
 #5         CELJE 2007-03-29
 #6 VELIKA POLANA 2007-03-29