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