Преобразование символа в дату в R при изменении формата даты по умолчанию - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующая символьная переменная в R:

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

Я хочу преобразовать ее в Date, изменить формат даты по умолчанию и сохранить тип данных в качестве Date, поэтому я начну с:

> 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 в качестве даты в этом новом (не по умолчанию) формате без преобразования обратно в символ?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вводя только имя переменной на консоли, она печатается с использованием аргументов по умолчанию print.Если вам нужен другой формат, измените способ работы print с Date:

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, изменить формат даты по умолчанию и сохранить тип данных в качестве Date

A Date вектор не имеет формата.Формат можно использовать при преобразовании его в вектор character (что и делает print), но Date на самом деле просто integer с другим классом.Целое число указывает количество дней после эпохи (1970-01-01):

x <- 1
x
# [1] 1
class(x) <- "Date"
x
# [1] "1970-01-02"
0 голосов
/ 01 июня 2018

1) chron print.Date всегда будет использовать гггг-мм-дд, но хрон будет использовать мм / дд / гг:

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"

Возможно, вам придется добавить дополнительные методы в зависимости от того, что вы хотите сделать.

...