Как изменить формат отображения POSIXct в консоли R и RStudio View () - PullRequest
0 голосов
/ 17 декабря 2018

Я могу прочитать даты из файла CSV, чтобы получить список дат и времени.Мой вход выглядит так:

2018/10/11 15:0:0

Я прочитал это в час p1 $.Мне это нужно в 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 отображает переменную POSIXct, и как RStudio View() отображает переменную.Я могу изменить часовой пояс, используемый для отображения.Есть ли способ изменить формат, используемый для отдыха?Я искал в options общий контроль, но не мог найти способ.

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете заменить метод 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"

В общем случае вы можете переписать любой метод класса S3:создание функций с именами, такими как generic.class, где generic - это имя универсальной функции, а class - класс, к которому применяется метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...