【发布时间】:2016-03-04 23:44:44
【问题描述】:
我编写了一个函数来查找一个季度的开始月份。在有人说已经回答之前,我不是在处理标准季度(一月到三月,四月到六月等)。季度可以是定制的,比如三月到五月,六月到八月等。我还搜索了一些包,如timeDate,zoo 等,看起来他们也不处理定制季度。
我写的函数在某些情况下不起作用。
我的功能
opening_month = function(s, c) {
return(
ifelse(s==c, s,
ifelse(s<c, (s+3*floor((c-s)/3)), (s+3*ceiling((c-s)/3)))
)
)
}
# S - Lead month of the quarter
# C - Month of Date in question
每个数据点都有这两个字段。 S 指定一个季度的开始时间,C 是我们需要找到它所属的任何季度的开始月份的日期。
数据看起来像(只有前 3 列)
+----+---------------------+----------------+---------+----------------+
| No | Creation Date ( C ) | Lead month (S) | Quarter | Starting month |
+----+---------------------+----------------+---------+----------------+
| 1 | 04 March 2015 | 1 | 1 to 3 | 1 |
| 2 | 04 March 2015 | 2 | 2 to 4 | 2 |
| 3 | 01 January 2015 | 6 | 12 to 2 | 12 |
| 4 | 20 November 2015 | 5 | 8 to 10 | 8 |
+----+---------------------+----------------+---------+----------------+
ex: No 3. Lead month = 3. 所以周期是 6 月到 8 月,9 月到 11 月,12 月到 2 月和 3 月到 5 月。创建日期 1 月 1 日在 12 月到 2 月之间。所以 12 月是开始月份,这是最终结果。
该函数获取前导月份 (S) 并从创建日期 (C) 中提取月份编号,以查找其所属季度的起始月份。
例如:C - 6(2015 年 6 月 21 日),S - 1
对于此数据点,季度从一月开始,因此它是标准周期。 1月至3月,4月至6月等。21-Jun-2015属于第二季度,第二季度的开始月份是4月或第4个月。
opening_month(1,6)
[1] 4
我的函数在这种情况下运行良好。
opening_month(2,6)
[1] 5
我的函数在这种情况下也能很好地工作。
从二月开始的季度,周期是二月到四月,五月到七月等。六月落在第二季度,开始月份是五月或第5个月。
opening_month(6,3)
[1] 3
这也是正确的。在这种情况下,季度从 6 月到 8 月、9 月到 11 月、12 月到 2 月、3 月到 5 月开始。现在是第 4 季度,开始月份是 3 月。
在某些情况下我的功能确实有效。
opening_month(6,1)
[1] 3
在这种情况下,季度从六月到八月,九月到十一月,十二月到二月。这是第三季度,开始月份应该是十二月。但是函数会给出 3 月或第 3 个月的结果。
我知道这里的限制。我的函数没有捕捉到几个月的循环关系。它不知道 12 月先于 1 月,周期是 1 月到 12 月到 1 月的循环。
有人可以帮我解决这个问题吗?
【问题讨论】: