上一季度末/上一季度的最后一天结束

时间:2014-11-19 11:33:50

标签: r date-arithmetic lubridate

使用lubridate,如何计算给定日期的上一季度的最后一天? 以下公式似乎不适用于2014年11月3日(其他日期工作)

library(lubridate)
date = as.POSIXct("2014-11-03")
date - days(day(date)) - months(month(date) %% 3 - 1)
# NA

有趣的是,改变订单有效:

date - months(month(date) %% 3 - 1) - days(day(date))
# "2014-09-30 UTC"

3 个答案:

答案 0 :(得分:4)

以下是来自包zootimeDate以及base R的函数的一些可能性。{G. 1]}代码由@ G.Grothendieck改进,他还建议zoo替代方案(非常感谢!)。我将base解决方案留给了其他人。

首先,使用包lubridate中的class yearqtr来表示季度数据。然后,您可以使用zooas.Date.yearqtr参数"这是0到1之间的数字,表示结果所代表的时间段的分数。默认值为0,表示期间的开始" (请参阅frac?yearqtr ?yearmon)。

一步一步:

frac

@ G.Grothendieck的简短版本(谢谢!)

library(zoo)

date <- as.Date("2014-11-03")

# current quarter
current_q <- as.yearqtr(date)
current_q
# [1] "2014 Q4"

# first date in current quarter
first_date_current_q <- as.Date(current_q, frac = 0)
first_date_current_q 
# [1] "2014-10-01"

# last date in previous quarter
last_date_prev_q <- first_date_current_q - 1
last_date_prev_q
# [1] "2014-09-30"

@ G.Grothendieck的一个很好的as.Date(as.yearqtr(date)) - 1 # [1] "2014-09-30" R解决方案

base

另一种可能性是在as.Date(cut(date, "quarter")) - 1 # [1] "2014-09-30" 包中使用timeFirstDayInQuartertimeLastDayInQuarter函数:

timeDate

答案 1 :(得分:1)

我知道这已经过时了,但由于这个问题特别要求一个重要的解决方案而我无法在其他地方找到工作代码,我想我会发布,请记住基础R解决方案可能是最简洁的:

> sampleDate <- ymd('2015-11-11')
> yearsToSample <- years(year(sampleDate) - year(origin))
> yearsToSample
[1] "45y 0m 0d 0H 0M 0S"
> additionalMonths <- months((quarter(sampleDate) - 1) * 3)
> additionalMonths
[1] "9m 0d 0H 0M 0S"
> startOfQuarter <- ymd(origin) + yearsToSample + additionalMonths - days(1)
> startOfQuarter
[1] "2015-09-30 UTC"

确认这适用于原点之前的日期(&#39; 1970-01-01&#39;)。

答案 2 :(得分:0)

这是 2021 年的纯润滑脂解决方案:

> date <- ymd("2014-11-03")
> yq(quarter(date, with_year = TRUE)) - days(1)
[1] "2014-09-30"

分解:

> # The year and quarter
> quarter(date, with_year = TRUE)
[1] 2014.4

> # The first day of the quarter as a date
> yq(quarter(date, with_year = TRUE))
[1] "2014-10-01"

# The day before the first day of the quarter as a date
> yq(quarter(date, with_year = TRUE)) - days(1)
[1] "2014-09-30"