如何在R Console和RStudio View()中更改POSIXct的显示格式

时间:2018-12-17 14:48:13

标签: r rstudio

我可以从CSV文件中读取日期,以获得日期和时间的列表。我的输入看起来像这样:

2018/10/11 15:0:0

我读到p1 $ hour。我在POSIXct中需要它,所以我转换了字符串:

p1$timeUtc <- as.POSIXct(p1$hour,tz='Asia/Calcutta')

因为我的CSV文件中的时间来自印度的IST时区。

当我观察到p1 $ timeUtc的属性时,我看到了

attributes(p1$timeUtc)
$class
[1] "POSIXct" "POSIXt" 
$tzone
[1] "Asia/Calcutta"

如果我要求在R控制台(在RStudio中)输入条目的值,我会看到

p1$timeUtc[[1]]
[1] "2018-10-11 15:00:00 IST"

$ tzone属性控制使用的显示格式。如果将其更改为UTC,我会看到同一时间显示在不同的区域:

> attr(p1$timeUtc,'tzone') <- 'UTC'
> p1$timeUtc[[1]]
[1] "2018-10-11 09:30:00 UTC"
> attr(p1$timeUtc,'tzone') <- 'Asia/Calcutta'
> p1$timeUtc[[1]]
[1] "2018-10-11 15:00:00 IST"

所以我可以在不更改变量值的情况下影响POSIXct变量的显示格式。

但是,如果csv数据恰好是午夜2018/10/12 00:0:0,则控制台输出将忽略时间:

> p1$timeUtc[[2]]
[1] "2018-10-12 IST"

这有点令人困惑。我希望它是'%Y-%m-%d %H:%M %Z'

此外,当我使用View(p1)在RStudio中显示数据表时,似乎使用了tzone属性,但最后省略了“ IST”。但是它会在深夜打印2018-10-12 00:00:00。 (但这也许只是因为我正在查看列表,而不是一个值?)

我知道我可以将POSIXct转换为字符串并根据需要打印出来。但是我不想那样做。我想指定R Console如何显示POSIXct变量,以及RStudio View()如何显示变量。我可以更改用于显示的时区。有没有办法更改其余格式?我在options中寻找通用控件,但找不到办法。

1 个答案:

答案 0 :(得分:1)

您可以将print方法替换为该类。查看print.POSIXct的代码:

function (x, tz = "", usetz = TRUE, ...) 
{
  max.print <- getOption("max.print", 9999L)
  FORM <- if (missing(tz)) 
    function(z) format(x, usetz = usetz)
  else function(z) format(x, tz = tz, usetz = usetz)
  if (max.print < length(x)) {
    print(FORM(x[seq_len(max.print)]), ...)
    cat(" [ reached getOption(\"max.print\") -- omitted", 
      length(x) - max.print, "entries ]\n")
  }
  else if (length(x)) 
    print(FORM(x), max = max.print, ...)
  else cat(class(x)[1L], "of length 0\n")
  invisible(x)
}

因此,格式化是通过在方法内部创建的FORM函数完成的。您可以通过对代码进行几次编辑来创建新方法,只要它名为print.POSIXct,R就会使用它。

as.POSIXct("2018-12-17 00:00:00", tz = "UTC")
# [1] "2018-12-17 UTC"

print.POSIXct <- function (x, tz = "", usetz = TRUE, ...) 
{
  max.print <- getOption("max.print", 9999L)
  FORM <- if (missing(tz)) 
    function(z) format(x, usetz = usetz, format = "%Y-%m-%d %H:%M:%S")
  else function(z) format(x, tz = tz, usetz = usetz, format = "%Y-%m-%d %H:%M:%S")
  if (max.print < length(x)) {
    print(FORM(x[seq_len(max.print)]), ...)
    cat(" [ reached getOption(\"max.print\") -- omitted", 
      length(x) - max.print, "entries ]\n")
  }
  else if (length(x)) 
    print(FORM(x), max = max.print, ...)
  else cat(class(x)[1L], "of length 0\n")
  invisible(x)
}

as.POSIXct("2018-12-17 00:00:00", tz = "UTC")
# [1] "2018-12-17 00:00:00 UTC"

通常,您可以通过创建名为generic.class的函数来覆盖任何S3类的方法,其中generic是通用函数的名称,class是该方法适用的类