Вопрос или проблема
Предположим, у меня есть дата, то есть 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
, чтобы выводить значение в нужном формате. Вот шаги, которые помогут вам достичь вашей цели:
- Создайте новый вектор с классом.
- Напишите метод вывода. Эта функция будет преобразовывать дату в формат
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
Как это работает
-
Создание числовой даты: Мы берём конкретную дату, преобразуем её в объект типа
Date
, а затем в числовое представление с помощьюas.numeric()
. -
Определение функции вывода: Функция
print.d9
определяет, как будет выводиться дата, когда объект этого класса будет напечатан. Мы используем стандартные функцииformat
иtoupper
, чтобы получить нужный формат. -
Присвоение класса: Присваиваем созданному вектору класс
d9
, чтобы использовать наш метод вывода при печати.
Проверка работы
Теперь при печати date_num
вы получите вывод в формате 23OCT2017
, который будет понятен в контексте, например, распространенного формате SAS, однако сами данные останутся числовыми:
# Пример использования
date_num + 30 # Проверка числового представления
Заключение
Используя вышеописанный метод, вы получите желаемое представление даты, сохранив при этом числовую природу данных. Это подход позволяет проводить арифметические операции с датами, оставаясь при этом в нужном формате для представления.
Такой подход является оптимальным для работы с датами в R, так как он обеспечивает необходимую гибкость и целостность данных, особенно при необходимости их преобразования для визуализации или отчетности.