How can I round a date to the quarter start/end?

后端 未结 3 1962
夕颜
夕颜 2021-01-04 22:45

I need to take a vector of dates and for each date get the first day of the next quarter.

(Or rather, to round to the last day of the current quarter, find the first

相关标签:
3条回答
  • 2021-01-04 23:21

    For any time interval (Annual, Quarterly, Monthly, Weekly), the following function gives the end date, using R base functions (as.POSIXlt and as.Date):

    endDate <- function(date, interval) {
        date.lt <- as.POSIXlt(date) 
        switch(interval, 
               A = {
                    date.lt$mon = 11
                    date.lt$mday=31
                    date=as.Date(date.lt)
                },
               Q = {
                    date.lt$mon = (date.lt$mon %/% 3 +1)*3 %% 12 
                    date.lt$mday = 1
                    date.lt$year = date.lt$year + as.integer(date.lt$mon==0)
                    date=as.Date(date.lt)-1
                },
               M = {
                    date.lt$mon = (date.lt$mon+1) %% 12
                    date.lt$mday = 1
                    date.lt$year = date.lt$year + as.integer(date.lt$mon==0)
                    date=as.Date(date.lt)-1
                },
               D = {
                   date = as.Date(date)
                },
               W = {
                   date = as.Date(date)+6-date.lt$wday
               },
               date = as.Date(date$lt)
        )
        date
    }
    ###
    endDate (c("2003-05-21","1945-03-29), "M")
    # "2003-05-31" "1945-03-31"
    endDate (c("2003-05-21","1945-03-29), "M")
    #"2003-06-30" "1945-03-31"
    
    0 讨论(0)
  • 2021-01-04 23:27

    The zoo package can help for many things date-related including this:

    library(zoo)
    
    as.yearqtr("2014-08-15", format="%Y-%m-%d")
    ## [1] "2014 Q3"
    
    as.Date(as.yearqtr("2014-08-15", format="%Y-%m-%d"))
    ## [1] "2014-07-01"
    

    But, that might not get you what you need (there are ways to extrapolate from those values).

    The timeDate package has:

    timeFirstDayInQuarter(charvec, format = "%Y-%m-%d", zone = "", FinCenter = "")
    timeLastDayInQuarter(charvec, format = "%Y-%m-%d", zone = "", FinCenter = "")
    

    which might make it easer to use and tweak to adjust for different Q1 start origins.

    0 讨论(0)
  • 2021-01-04 23:43

    I know it’s an old thread but I found my way here from a recent duplicate post.

    lubridate::ceiling_date() now accepts quarters.

    0 讨论(0)
提交回复
热议问题