将r中的整数转换为日期格式的函数中的错误,错误:“不知道如何转换'。”来分类“日期””

时间:2020-04-09 09:58:05

标签: r date integer character

我是R的新手,无法找到Google搜索的解决方案,所以我们开始:

我有一个包含许多列的数据框。其中两个有日期。一列为character,另一列为integer64。两列中的值都看起来像这样的“ 201802171254”。因此它们的格式为Y%m%d%H%M。我想使用一个函数将它们转换为日期格式。在此之前,我尝试了以下两行:

df$column_character <- as.Date(as.character(c(df$column_character)), format = '%Y%m%d%H%M')

df$column_integer64 <- as.Date(as.character(c(df$column_integer64)), format = '%Y%m%d%H%M')

我知道,这不是最佳选择,但是它们可以工作。我得到两列的日期格式。所以我试图将代码放入一个函数中:

date_format <- function(df, col){
  col_q = enquo(col)

df %>%

base::as.Date(as.character(c(!!col_q), na.rm = TRUE), format = '%Y%m%d%H%M')

}

date_format(df$column_character)

date_format(df$column_integer64)

这有效,但仅对第一个character列有效。 对于integer64列,我收到错误消息:

Error in as.Date.default(., as.character(c(!!col_q), na.rm = TRUE), format = "%Y%m%d%H%M") : 
  do not know how to convert '.' to class “Date” 

这让我感到困惑,因为如果我完全希望字符列遇到困难,因为在代码中我有一个不必要的步骤(将其转换为字符,然后再转换为日期,但已经是字符)。

我的错误在哪里?为什么没有该功能就可以工作,但是我尝试将其用作模板,其中一半不再工作了?

感谢您提前回答

1 个答案:

答案 0 :(得分:1)

无法确切告诉您,该函数为什么首先起作用。但是,我认为您的功能没有得到很好的指定或弄乱。如果您想使用整洁的评估,请看一下我的函数date_format_new。但是,我认为有一种更简单的方法来设置函数,我将其编码为date_format_simple

library(dplyr)

df <- data.frame(
  column_character = "201802171254",
  column_integer64 = 201802171254,
  stringsAsFactors = FALSE
)

date_format <- function(df, col){
  col_q = enquo(col)

  df %>%
    base::as.Date(as.character(c(!!col_q), na.rm = TRUE), format = '%Y%m%d%H%M')
}

date_format(df$column_character)
#> [1] "2018-02-17"
date_format(df$column_integer64)
#> Error: Quosures can only be unquoted within a quasiquotation context.
#> 
#>   # Bad:
#>   list(!!myquosure)
#> 
#>   # Good:
#>   dplyr::mutate(data, !!myquosure)

# Works
date_format_new <- function(df, col){
  col_q = enquo(col)

  df %>%
    pull(!!col_q) %>% 
    as.character() %>% 
    base::as.Date(format = '%Y%m%d%H%M')

}

date_format_new(df, column_character)
#> [1] "2018-02-17"
date_format_new(df, column_integer64)
#> [1] "2018-02-17"

# Simpler
date_format_simple <- function(col){
  base::as.Date(as.character(col), format = '%Y%m%d%H%M')
}

date_format_simple(df$column_character)
#> [1] "2018-02-17"
date_format_simple(df$column_integer64)
#> [1] "2018-02-17"

reprex package(v0.3.0)于2020-04-09创建