【问题标题】:How can I round a date to the quarter start/end?如何将日期舍入到季度开始/结束?
【发布时间】:2014-04-13 17:23:55
【问题描述】:

我需要获取一个日期向量,并为每个日期获取下一季度的第一天。

(或者更确切地说,四舍五入到当前季度的最后一天,找到下一个季度的第一天并起飞是我的计划)

lubridate 将四舍五入/上限为月,但不是季度

到目前为止,我发现的唯一解决方案是列出从 1970 年到 2099 年的所有季度的向量,然后通过它搜索以找到我的日期之后的最短日期。很明显,这矢量化和扩展性很差。

我需要能够指定年终月份(尽管年份总是从每月 1 日开始)

例如

x = as.Date("2014-08-15")
RoundToQuarterStart(x, yearStarts = "March")
[1] "2014-09-01"

在本例中,由于年份从 3 月 1 日开始,因此第三季度从 9 月 1 日开始,即给定日期之后的下一个季度开始。 (或者相当于这个日期属于在 8 月 31 日结束的第二季度)

【问题讨论】:

    标签: r date rounding


    【解决方案1】:

    zoo 包可以帮助处理许多与日期相关的事情,包括:

    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"
    

    但是,这可能无法满足您的需求(有一些方法可以从这些值中推断出来)。

    timeDate 包有:

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

    这可能会使其更易于使用和调整以适应不同的 Q1 开始来源。

    【讨论】:

    • 还要注意季度的最后一天是:as.Date(as.yearqtr("2014-08-15", format="%Y-%m-%d"), frac = 1)
    • 使用zoo-1.8.8as.Date(.) 错误do not know how to convert 'as.yearqtr(.)' to class "Date"
    【解决方案2】:

    我知道这是一个旧帖子,但我是从最近的重复帖子中找到的。

    lubridate::ceiling_date() 现在接受宿舍。

    【讨论】:

    • 我想补充一下,如果您需要一个季度的最后一天。你可以使用ceiling_date(x = seq.Date(from = as.Date("2019-01-01"), to = as.Date(Sys.Date()), by = "quarter"), "quarter", change_on_boundary = TRUE) - days(1)
    【解决方案3】:

    对于任何时间间隔(每年、每季度、每月、每周),以下函数使用 R 基函数(as.POSIXlt 和 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多