Если вы действительно хотите конвертировать его в класс "Date"
, используя первое из месяца, то решение Roland кажется самым прямым, но есть и другие соображения, например, можно ли использовать конец месяца или действительно ли вы хотите представить год-месяцы, используя даты в первую очередь.
пакет зоопарк имеет "yearmon"
класс, который может представлять год-месяцев непосредственно без их преобразования даты, а также имеет as.Date.yearmon
метод, который имеет frac=
аргумент может быть использован для определения доли пути через месяц, чтобы преобразовать если вы хотите "Date"
класс.
Во-первых, убедитесь, что даты являются символьными строками. Ввод в вопросе показывает 1993.10 как один из входных данных, поэтому мы должны убедиться, что существует конечный ноль. (Если входы уже являются символами с конечным нолем, то это не проблема. Мы предположили, что худший случай здесь предполагает числовое значение, так что нам нужно явно преобразовать их в характерные укусы с конечным 0, если это необходимо.) Теперь используйте as.yearmon
с форматом "%Y.%m"
. Наконец, используйте as.Date.yearmon
для преобразования в класс "Date"
.
Пожалуй, самое большое преимущество этого подхода заключается в том, что мы могли бы просто оставить результат в "yearmon"
класса (т.е. опустить "as.Date"
часть, например, as.yearmon(sprintf("%.2f", dates))
или если даты уже были символьные строки, dates.ch
, с завершающего 0 в случае "1993.10"
то просто as.yearmon(dates.ch, "%Y.%m")
, которые на самом деле представляют собой то, что у вас есть лучше, так как на следующий день на самом деле не имеет смысла, учитывая, что его там не было в самом начале. "yearmon"
объекты могут быть построены и сортируются в ожидаемом порядке.
Вот преобразование в "Date"
класс с использованием "yearmon"
:
library(zoo)
dates <- c(1993.07, 1993.08, 1993.09, 1993.1, 1993.11, 1993.12) # test input
as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m")) # 1st of month
## [1] "1993-07-01" "1993-08-01" "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01"
as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m"), frac = 1) # last of month
## [1] "1993-07-31" "1993-08-31" "1993-09-30" "1993-10-31" "1993-11-30" "1993-12-31"
или если входной тест выглядит следующим образом:
dates.ch <- c("1993.07", "1993.08", "1993.09", "1993.10", "1993.11", "1993.12") # input
as.Date(as.yearmon(dates.ch, "%Y.%m"))
as.Date(as.yearmon(dates.ch, "%Y.%m"), frac = 1)
Параметр 'dput' является' х <- с (1993,09, 1993,1, 1993,11, 1993,12) ', но ваши решения до сих пор работает. –
@DavidArenburg R не заботится, если вы дадите ему '1993.1' или' 1993.10'. Это идентичный двойной. – Roland