【问题标题】:Calculating first and last day of month from a yearmon object从 yearmon 对象计算每月的第一天和最后一天
【发布时间】:2019-03-09 17:57:15
【问题描述】:

我有一个简单的 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、lubridatexts / zoo 来计算每个月的第一天和最后几天。

我见过其他可以做到这一点的包,但如果可能的话,我想坚持使用前面提到的。

【问题讨论】:

    标签: r xts zoo lubridate


    【解决方案1】:

    我们可以使用

    library(dplyr)
    library(lubridate)
    library(zoo)
    df %>% 
       mutate(firstday = day(year_mon), last = day(as.Date(year_mon, frac = 1)))
    

    【讨论】:

      【解决方案2】:

      使用基数 R,您可以使用 as.Dateyearmon 对象转换为日期,这将为您提供该月的第一天。对于最后一天,我们可以将日期增加一个月(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
      

      【讨论】:

        【解决方案3】:

        使用来自动物园的as.Date.yearmon,如图所示。 frac 指定要使用的月份的小数部分,因此 0 是月初,1 是月底。 frac的默认值为0。

        如果您正在使用 yearmon(因为这是定义 yearmon 方法的地方),那么您必须已经在使用 zoo,因此这不涉及使用超出您已经使用的任何其他包。

        如果您使用的是 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-04
          • 1970-01-01
          • 2021-12-11
          • 2011-01-06
          • 1970-01-01
          • 2010-09-18
          • 2012-03-12
          • 2016-02-09
          相关资源
          最近更新 更多