преобразовать дату в формате месяц-год в последнюю дату месяца - PullRequest
0 голосов
/ 24 июня 2019

Мой набор данных выглядит так

dataset=data.frame(ID=c(1,2,3,4,5),MonthYear=c("May 2015","April 2015","January 2016","February 2016","December 2018"))

Я бы хотел добавить к нему столбец , содержащий дату последнего дня месяца для данного месяца-года (столбец MonthYear)

Например, месяц-год May 2015 станет 31-05-2015

Использование пакета zoo, который я пытался использовать as.Date(as.yearqtr(MonthYear, "%b%Y"), frac = 1) основанный на решении, которое я нашел на этом форуме, но, похоже, оно не работает.

Ответы [ 4 ]

3 голосов
/ 24 июня 2019

С zoo вместо as.yearqtr мы используем as.yearmon, так как формат в 'Месяц год'

library(zoo)
as.Date(as.yearmon(dataset$MonthYear), frac = 1)
#[1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"
2 голосов
/ 24 июня 2019

Проблема в том, что

  1. Ваш формат неверный.Формат, показанный в вопросе, предназначен для сокращенного месяца, за которым следует год без пробелов между ними.На самом деле данные имеют полное название месяца, за которым следует пробел, за которым следует год.

  2. yearqtr используется в указанном коде, но это год и кварталгод, тогда как у вас есть год и месяц года.Используйте yearmon, а не yearqtr.

При внесении этих изменений будет получен следующий код

transform(dataset, eom = as.Date(as.yearmon(MonthYear, "%B %Y"), frac = 1))

, что дает:

  ID     MonthYear        eom
1  1      May 2015 2015-05-31
2  2    April 2015 2015-04-30
3  3  January 2016 2016-01-31
4  4 February 2016 2016-02-29
5  5 December 2018 2018-12-31
1 голос
/ 24 июня 2019

В базе R мы можем добавить месяц с seq и вычесть день.

as.Date(mapply(function(x) seq(x, length.out=2, by="month")[2] - 1, 
               as.Date(paste("01", dataset$MonthYear), "%d %B %Y")), 
        origin="1970-01-01")
# [1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"

Примечание: as.Date(dataset$MonthYear, "%B %Y") не будет работать как-то, я незнаете почему ...?

Данные

dataset <- structure(list(MonthYear = structure(c(5L, 1L, 4L, 3L, 2L), .Label = c("April 2015", 
"December 2018", "February 2016", "January 2016", "May 2015"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))
1 голос
/ 24 июня 2019

Используя lubridate, мы можем преобразовать MonthYear в объект даты и использовать ceiling_date с unit = "Month" и вычесть из него 1 день, чтобы получить последний день месяца.

library(lubridate)
ceiling_date(dmy(paste("01", dataset$MonthYear)), unit = "month") - 1
#[1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...