将季度添加到R日期

时间:2016-06-26 20:32:19

标签: r date time-series zoo lubridate

我有一个R时间序列数据,我计算所有值到特定日期的均值,并将此均值存储在日期+4个季度。日期是月末。为实现这一目标,我希望将4个季度增加到一个日期。我的问题是如何将4个季度添加到R日期数据类型。举例说明:

a <- as.Date("2006-01-01")
b <- as.Date("2011-01-01")
date_range <- quarter(seq.Date(a, b, by = "quarter"), with_year = TRUE)

> date_range[1] + 1
[1] 2007.1

> date_range[1] + quarter(1)
[1] 2007.1

> date_range[1] + 0.25
[1] 2006.35

我想到的一种可能方式是获取年度季度日期,然后再添加4。但不确定最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

只需添加12个月或一年?

或者如果它必须是四分之一,请定义一个函数,如下所示:

quarters <- function(x) {
   months(3*x)
}

然后用它来添加日期序列:

date_range <- seq.Date(a, b, by = "quarter")
date_range + quarters(4)

答案 1 :(得分:1)

问题是宿舍有不同的长度。 Q1是最短的,因为它包括二月(虽然它与闰年的第二季度相关)。这样的事情会使&#34;在日期中添加四分之一&#34; 定义不明确。即使在几个月内添加月份也可能在最后几个月很棘手 - 1月31日之后的1个月?

几个月的开始更直接,我建议你使用第一天的季度而不是最后一天(如果你必须使用特定的日期)。 lubridate提供floor_date()ceiling_date()等函数,您可以将unit = "quarter"传递给months(3),它们将分别返回当前或后续季度的第一天。您也可以在一个月的开始中将#添加到一天,当然如果您打算添加4个季度,也可以添加1年。

答案 2 :(得分:0)

Lubridate具有已包含的四分之一的功能。这是比创建自己的函数更好的解决方案。

https://www.rdocumentation.org/packages/lubridate/versions/1.7.4/topics/quarter

答案 3 :(得分:0)

注意到问题上的动物园标记,yearmon类将年/月表示为年+分数,其中分数是1月为0,2月为1 / 12,3月为2 / 12,12月为... / 11/12 。因此,添加4个季度只需添加1。(添加x个季度可通过添加x / 4来完成。)

library(zoo)
ym <- yearmon(2006) + 0:11/12   # months in 2006
ym + 1 # one year later

这还将转换yearmon对象为月末日期,并将第二行Date转换为yearmon。在第一行中使用frac = 0或省略frac将转换为月初日期。

d <- as.Date(ym, frac = 1)  # d is Date vector of end-of-months
as.yearmon(d)  # convert Date vector to yearmon

如果您输入的日期表示季度,则还有yearqtr类,表示年份/季度为年份+分数,其中对于一年的四个季度,分数分别为0、1 / 4、2 / 4、3 / 4。通过添加1(或者将x个季度增加x / 4)来添加4个季度。

yq <- as.yearqtr(2006) + 0:3/4   # all quarters in 2006
yq + 1  # one year later

转化的工作方式与Yearmon类似:

d <- as.Date(ym, frac = 1)  # d is Date vector of end-of-quarters
as.yearqtr(d)  # convert Date vector to yearqtr