Вычисление первого и последнего дня месяца из объекта yearmon - PullRequest
0 голосов
/ 09 марта 2019

У меня есть простой df со столбцом дат в yearmon классе:

df <- structure(list(year_mon = structure(c(2015.58333333333, 2015.66666666667, 
                                  2015.75, 2015.83333333333, 2015.91666666667, 2016, 2016.08333333333, 
                                  2016.16666666667, 2016.25, 2016.33333333333), class = "yearmon")), class = c("tbl_df", 
                                                                                                               "tbl", "data.frame"), row.names = c(NA, -10L))

Я бы хотел простой способ, предпочтительно использовать основание R, lubridate или xts / zoo для вычисления первого и последнего дней каждого месяца.

Я видел другие пакеты, которые делают это, но я хотел бы придерживаться вышеупомянутого, если это возможно.

Ответы [ 3 ]

2 голосов
/ 09 марта 2019

Мы можем использовать

library(dplyr)
library(lubridate)
library(zoo)
df %>% 
   mutate(firstday = day(year_mon), last = day(as.Date(year_mon, frac = 1)))
2 голосов
/ 09 марта 2019

Используя базу R, вы можете преобразовать объект yearmon в дату, используя as.Date, что даст вам первый день месяца.За последний день мы могли бы увеличить дату на месяц (1/12) и вычесть из нее 1 день.

df$first_day <- as.Date(df$year_mon)
df$last_day <- as.Date(df$year_mon + 1/12) - 1
df  

#   year_mon      first_day  last_day  
#   <S3: yearmon> <date>     <date>    
# 1 Aug 2015      2015-08-01 2015-08-31
# 2 Sep 2015      2015-09-01 2015-09-30
# 3 Oct 2015      2015-10-01 2015-10-31
# 4 Nov 2015      2015-11-01 2015-11-30
# 5 Dec 2015      2015-12-01 2015-12-31
# 6 Jan 2016      2016-01-01 2016-01-31
# 7 Feb 2016      2016-02-01 2016-02-29
# 8 Mar 2016      2016-03-01 2016-03-31
# 9 Apr 2016      2016-04-01 2016-04-30
#10 May 2016      2016-05-01 2016-05-31
1 голос
/ 09 марта 2019

Используйте as.Date.yearmon из зоопарка, как показано на рисунке.frac указывает дробную сумму в месяце, которую следует использовать, так что 0 - начало месяца, а 1 - конец.Значение по умолчанию frac равно 0.

Вы уже должны использовать zoo, если используете yearmon (поскольку именно здесь определены методы yearmon), поэтому это не требует использования каких-либо дополнительныхпакеты за пределы того, что вы уже используете.

Если вы используете dplyr, при желании замените transform на mutate.

transform(df, first = as.Date(year_mon), last = as.Date(year_mon, frac = 1))

дает:

   year_mon      first       last
1  Aug 2015 2015-08-01 2015-08-31
2  Sep 2015 2015-09-01 2015-09-30
3  Oct 2015 2015-10-01 2015-10-31
4  Nov 2015 2015-11-01 2015-11-30
5  Dec 2015 2015-12-01 2015-12-31
6  Jan 2016 2016-01-01 2016-01-31
7  Feb 2016 2016-02-01 2016-02-29
8  Mar 2016 2016-03-01 2016-03-31
9  Apr 2016 2016-04-01 2016-04-30
10 May 2016 2016-05-01 2016-05-31
...