【问题标题】:Changing the Date print format, retaining its mode, class and type更改日期打印格式,保留其模式、类别和类型
【发布时间】:2016-03-21 08:19:23
【问题描述】:

我有一个Date,我使用format 将打印格式更改为例如"%Y%m%d":

m <- as.Date("30-sep-15","%d-%b-%y")
l <- format(m, "%Y%m%d")
# [1] "20150930"

现在,格式化对象的类是character

class(l)
# "character"

类和模式更改为character。我们能否在这个对象上保留Date 类,并且仍然以如下格式显示这个对象:20150930

【问题讨论】:

  • 你不能只覆盖base 中的print.Dateformat.Date 方法吗?我的意思是我试过但做不到:) - 但我认为你可以做到。可能也不是一件好事。
  • 我们为什么要这样做?告诉我们更多,也许有更好的方法来解决这个问题。
  • 我想执行日期的操作,比如通过 k=seq(m, by= "1 month", length.out= 4) 生成后续 3 个月的序列但是我希望 k 是显示为 (20150930,20151030,20151130),而不是传统的日期格式
  • 如果你使用我下面的回答,你可以定义一个保留“prettyDate”类的seq.prettyDate方法,但请考虑@zx8754的评论。

标签: r date


【解决方案1】:

您可以使用关联的print 方法定义自己的 S3 类:

m <- as.Date("30-sep-15","%d-%b-%y")
m

prettyDate <- function(x) {
  if (!inherits(x, "Date")) stop("Only objects of class 'Date' can be prettyDates.")
  class(x) <- c("prettyDate", class(x))
  x
}

m <- prettyDate(m)

print.prettyDate <- function(x, ...) {
  stopifnot(inherits(x, "Date"))
  print.default(format(x, "%Y%m%d"))
}

m
#[1] "20150930"
class(m)
#[1] "prettyDate" "Date" 

如果您还希望在 data.frames 中打印您的格式,您还需要定义一个 format 方法。

如果附加类没有方法,Date 方法仍将用于对象:

as.POSIXct(m)
#[1] "2015-09-30 02:00:00 CEST"

【讨论】:

  • 我试过你的方法,但是在这个日期尝试操作后 pp=seq(m,by= "1 month", length.out=3) pp [1] "2015-09-30" "2015-10-30" "2015-11-30" 有什么办法可以使这个prettydate数据类型的操作结果也采用相同的格式?
  • 见我上面的评论。但是,很可能您应该简单地使用普通的Date 打印。你为什么坚持打印自己的格式?
  • 那么我需要定义一个函数来专门打印指定格式的prettydate类吗? (我有点新,所以对一些术语不太熟悉)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2020-08-14
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多