【问题标题】:Convert character to date in R while changing date default format在更改日期默认格式时将字符转换为 R 中的日期
【发布时间】:2018-11-12 00:09:47
【问题描述】:

我在 R 中有以下字符变量:

> d <- "06/01/2018"
> class(d)
> "character"

我想将其转换为日期,更改默认日期格式,并将数据类型保持为日期,所以我开始:

> d <- as.Date(s, format = "%m/%d/%Y")
> class(d)
> "Date"

一切都很好,但是默认日期格式以年份而不是月份开头 - 我希望它以月份开头:

> d
> "2018-06-01"

所以如果我再次格式化,日期从现在的月份开始,但它会将变量变回字符!

> d <- format(d, "%m/%d/%Y")
> d
> "06/01/2018"
> class(d)
> character

如何在这种新的(非默认)格式中将 d 保留为 Date 而不会转换回字符?

【问题讨论】:

    标签: r date type-conversion character


    【解决方案1】:

    通过在控制台中输入一个变量名,它会使用print 的默认参数打印出来。如果您想要不同的格式,请更改 printDate 的工作方式:

    Sys.Date()
    # [1] "2018-06-04
    
    print.Date <- function (x, max = NULL, ...) {
      if (is.null(max)) 
        max <- getOption("max.print", 9999L)
      n_printed <- min(max, length(x))
      formatted <- strftime(x[seq_len(n_printed)], format = "%m/%d/%Y")
      print(formatted, max = max, ...)
      if (max < length(x)) {
        cat(" [ reached getOption(\"max.print\") -- omitted", 
          length(x) - max, "entries ]\n")
      } else if (length(x) == 0L) {
        cat(class(x)[1L], "of length 0\n")
      }
      invisible(x)
    }
    
    Sys.Date()
    # [1] "06/04/2018"
    

    这只是标准的print.Date 函数,稍作修改。

    但我必须对此发表评论:

    我想将其转换为日期,更改默认日期格式,并将数据类型保持为日期

    Date 向量没有格式。将其转换为 character 向量时可以使用格式(这是 print 所做的),但 Date 实际上只是具有不同类的 integer。整数给出历元 (1970-01-01) 过去的天数:

    x <- 1
    x
    # [1] 1
    class(x) <- "Date"
    x
    # [1] "1970-01-02"
    

    【讨论】:

    • 但如果我使用strftime,我会得到character。我想要一个Date
    【解决方案2】:

    1) chron print.Date 将始终使用 yyyy-mm-dd 但 chron 将使用 mm/dd/yy:

    library(chron)
    
    d <- "06/01/2018"
    as.chron(d)
    ## [1] 06/01/18
    

    2) 子类您可以定义 Date 的 S3 子类,以所需的方式显示:

    as.subDate <- function(x, ...) UseMethod("as.subDate")
    as.subDate.character <- function(x, ...) {
      structure(as.Date(x, "%m/%d/%Y"), class = c("subDate", "Date"))
    }
    format.subDate <- function(x, ...) format.Date(x, "%m/%d/%Y")
    as.subDate(d)
    
    ## [1] "06/01/2018"
    

    您可能需要添加更多方法,具体取决于您要执行的操作。

    【讨论】:

    • 有没有办法做到这一点,而无需从 CRAN 安装任何额外的东西?
    • 已添加(2)。
    • 我意识到这可能是不可能的。当您将Date 对象存储在 R 中的变量中时,默认格式似乎是从年份开始。更改会将对象转换为character
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多