Синтаксис R для преобразования даты в формат SAS date9, при этом дата должна быть числовой, а изменяться должен только формат.

Вопрос или проблема

Предположим, у меня есть дата, то есть 2017-10-23, и я хочу, чтобы результат выглядел как 23OCT2017

date <- '2017-10-23'

date2 <- toupper(format(as.Date('2017-10-23'),'%d%b%Y'))
str(date2)
chr "23OCT2017"

Однако это приводит к символической дате, хотя я хочу, чтобы она была числовой, но формат должен быть 23OCT2017. Мог бы кто-нибудь подсказать, как это осуществить

R на самом деле не имеет понятия “формат”, что, я подозреваю, вы взяли из SAS.

Что вы можете сделать, так это создать новый класс и написать метод печати для этого класса, чтобы отображать значения любым способом. Например, если я создам:

print.d9 = function(x){
    print(
      toupper(
        format(
         as.Date(unclass(x),origin="1970-01-01"),
         '%d%b%Y')))
}

Тогда числовой вектор выглядит как числа:

> v = c(0, 366, 1000)
> v
[1]    0  366 1000

пока я не переклассифицирую его как “d9”:

> class(v) = c("numeric","d9")

и тогда он печатает с использованием функции print.d9:

> v
[1] "01JAN1970" "02JAN1971" "27SEP1972"

Но базовые данные числовые:

> v
[1] "01JAN1970" "02JAN1971" "27SEP1972"
> v+30
[1] "31JAN1970" "01FEB1971" "27OCT1972"

Но это только половина работы, например, так вы не можете поместить их в дата-фрейм и все еще видеть символическое представление:

> data.frame(x1=v)
    x1
1    0
2  366
3 1000

Да, существуют способы обойти это, но любой разумный код будет использовать родные даты R настолько, насколько это возможно, и только в последний момент преобразовывать в конкретный формат даты. Объекты даты R числовые и могут быть помещены в дата-фреймы, в отличие от моего класса d9 выше. И вы уже написали код для преобразования в нужный вам формат.

Ответ или решение

Вопрос преобразования дат в R и получение формата, аналогичного SAS date9, но с числовым представлением, представляет собой интересную задачу. Ваша цель — получить формат даты, который отображается как 23OCT2017, при этом оставаясь в числовом формате. Давайте рассмотрим возможное решение этой задачи.

Понимание основ

В R даты хранятся как числовые значения, где каждый интервал соответствует одному дню, начиная с 1 января 1970 года. Однако R, в отличие от SAS, не предоставляет возможностей для работы с форматами даты на уровне данных. Вместо этого мы можем создать новый класс для формата даты и определить для него специальный метод вывода.

Решение задачи

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

  1. Создайте новый вектор с классом.
  2. Напишите метод вывода. Эта функция будет преобразовывать дату в формат DDMONYYYY.

Вот пример кода, который иллюстрирует этот процесс:

# Создаем вектор, который будет содержать даты как числа
date_num <- as.numeric(as.Date("2017-10-23"))

# Определяем метод вывода для нового класса "d9"
print.d9 <- function(x) {
    # Преобразуем к дате и форматируем вывод
    formatted_date <- toupper(format(as.Date(unclass(x), origin = "1970-01-01"), '%d%b%Y'))
    cat(formatted_date, "\n")
}

# Устанавливаем класс для вектора date_num
class(date_num) <- c("numeric", "d9")

# Выводим вектор
date_num

Как это работает

  1. Создание числовой даты: Мы берём конкретную дату, преобразуем её в объект типа Date, а затем в числовое представление с помощью as.numeric().

  2. Определение функции вывода: Функция print.d9 определяет, как будет выводиться дата, когда объект этого класса будет напечатан. Мы используем стандартные функции format и toupper, чтобы получить нужный формат.

  3. Присвоение класса: Присваиваем созданному вектору класс d9, чтобы использовать наш метод вывода при печати.

Проверка работы

Теперь при печати date_num вы получите вывод в формате 23OCT2017, который будет понятен в контексте, например, распространенного формате SAS, однако сами данные останутся числовыми:

# Пример использования
date_num + 30  # Проверка числового представления

Заключение

Используя вышеописанный метод, вы получите желаемое представление даты, сохранив при этом числовую природу данных. Это подход позволяет проводить арифметические операции с датами, оставаясь при этом в нужном формате для представления.

Такой подход является оптимальным для работы с датами в R, так как он обеспечивает необходимую гибкость и целостность данных, особенно при необходимости их преобразования для визуализации или отчетности.

Оцените материал
Добавить комментарий

Капча загружается...