R Как преобразовать десятичное число (год. месяц) в формат даты

#r #date #decimal

#r #Дата #десятичное

Вопрос:

Мои данные содержат информацию о дате в числовом формате decimal, и из-за этого подмножество October равно Jan.(010 => 1), as.POSIXct и as.Дата не применяется. При использовании substring(или substr) для получения последних двух цифр оно автоматически преобразуется в символ, затем 010 становится 1.

 num<-c(2019.009, 2019.010,2019.011)

Y<-as.numeric(substring(num,1,4))
M<-as.numeric(substr(num, 7,8))
as.yearmon(paste(Y,M),"%Y %m")
  [1] "Sep 2019" "Jan 2019" "Nov 2019"

as.POSIXct(num, tx="GMT","%Y %m")
  Error in as.POSIXct.numeric(num, tx = "GMT", "%Y %m") : 
  'origin' must be supplied
as.Date(num, "%Y %m")
  Error in charToDate(x) : 
  character string is not in a standard unambiguous format
  

Комментарии:

1. Почему вы не читаете сообщение об ошибке? Конструкция yearmon является числовой, поэтому вам нужно начало координат.

2. Предполагаемый двойной экземпляр предназначен для ввода символов, а этот — для ввода чисел.

Ответ №1:

в базе R вы можете использовать такие функции, как strptime/as.Date strftime/format и т.д. и т.д.

способ 1:

 strftime(strptime(sprintf("%.3f01",num),"%Y.0%m%d"),"%b %Y")

[1] "Sep 2019" "Oct 2019" "Nov 2019"
  

способ 2:

 format(as.Date(sprintf("%.3f01",num),"%Y.0%m%d"),"%b %Y")

[1] "Sep 2019" "Oct 2019" "Nov 2019"
  

Конечно, вы могли бы перепутать функции, например strptime , format и т. Д

если вы используете zoo библиотеку, вы могли бы сделать:

 zoo::as.yearmon(sprintf("%.3f", num), "%Y.0%m")

[1] "Sep 2019" "Oct 2019" "Nov 2019"
  

Ответ №2:

Вы можете использовать sprintf фиксированное количество знаков после запятой и использовать sub для извлечения первых 4 цифр и последних 2 цифр в данных и преобразования в класс year month .

 num<-c(2019.009, 2019.010,2019.011)
zoo::as.yearmon(sub('(\d{4})\..(\d{2})$', '\1-\2', sprintf('%0.3f', num)))
#[1] "Sep 2019" "Oct 2019" "Nov 2019"
  

Ваш исходный код также будет работать после использования sprintf :

 num <- sprintf('%0.3f', num)
Y<-as.numeric(substring(num,1,4))
M<-as.numeric(substr(num, 7,8))
zoo::as.yearmon(paste(Y,M),"%Y %m")
#[1] "Sep 2019" "Oct 2019" "Nov 2019"
  

Комментарии:

1. что означает ‘%0.3f?

2. Он содержит 3 знака после запятой, num поэтому последний 0 не отбрасывается 2019.010 .