R 上季度末/上季度最后一天

R 上季度末/上季度最后一天,r,date-arithmetic,lubridate,R,Date Arithmetic,Lubridate,使用lubridate,如何计算给定日期前一季度的最后一天? 以下公式似乎不适用于2014年11月3日(其他日期适用) 有趣的是,改变顺序是有效的: date - months(month(date) %% 3 - 1) - days(day(date)) # "2014-09-30 UTC" 下面是一些来自软件包zoo和timeDate以及baseR的函数的可能性。@G.Grothendieck改进了zoo代码,他还提出了base备选方案(非常感谢!)。我将lubridate解决方案留给其他

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

有趣的是,改变顺序是有效的:

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

下面是一些来自软件包
zoo
timeDate
以及
base
R的函数的可能性。@G.Grothendieck改进了
zoo
代码,他还提出了
base
备选方案(非常感谢!)。我将
lubridate
解决方案留给其他人

首先,使用package
zoo
中的
class
yearqtr
表示季度数据。然后,您可以使用
作为.Date.yearqtr
frac
参数“这是一个介于0和1之间(包括0和1)的数字,表示结果所代表的整个期间的分数。默认值为0,表示期间的开始”(请参见
?yearqtr
,对于
frac
,请参见
?yearmon

逐步:

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提供的优质
base
R解决方案

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

library(timeDate)
timeLastDayInQuarter(timeFirstDayInQuarter(date) - 1)
# GMT
# [1] [2014-09-30]

我知道这是一个古老的问题,但由于这个问题特别要求使用lubridate解决方案,而我在其他地方找不到适用于它的工作代码,我想我会发布它,记住基本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"
>采样日期年份至采样年份至采样
[1] “45y 0m 0d 0H 0m 0S”
>额外月份额外月份
[1] “9m 0d 0H 0M 0S”
>startOfQuarter startOfQuarter
[1] “2015-09-30 UTC”

确认这也适用于原产地(“1970-01-01”)之前的日期。

这是一种适用于2021年的纯润滑油溶液:

>日期yq(季度(日期,年=TRUE))-天(1)
[1] "2014-09-30"
细分:

#年度和季度
>季度(日期,年=真)
[1] 2014.4
>#季度的第一天作为日期
>yq(季度(日期,年=真))
[1] "2014-10-01"
#季度第一天的前一天作为日期
>yq(季度(日期,年=TRUE))-天(1)
[1] "2014-09-30"

如果您尝试使用
“2014-03-30”
,数学也会出错。这里是zoo解决方案的较短版本:
as.Date(as.yearqtr(Date))-1
这里有一个不使用任何包的解决方案:
as.Date(cut(Date,“quarter”)-1
@G.Grothendieck,非常简单……谢谢!我会编辑。
library(timeDate)
timeLastDayInQuarter(timeFirstDayInQuarter(date) - 1)
# GMT
# [1] [2014-09-30]
> 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"