#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
.