我写了一个函数来查找一个季度的开始月份。在有人说已经回答之前,我没有处理标准宿舍(1月到3月,4月到6月等)。季度可能是定制的,比如Mar到May,Jun到Aug等等。我也搜索了一些包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 |
+----+---------------------+----------------+---------+----------------+
前:否3.领先月份= 3.所以周期为6月至8月,9月至11月,12月至2月和3月至5月。创建日期从1月1日到12月到2月,所以12月是最后一个结果的开始月份。
该功能需要提前一个月(S),并从创建日期(C)中提取一个月号,以查找它所属的季度的起始月份。
Ex:C - 6(2015年6月21日),S - 1
对于此数据点,Quarter于1月开始,因此它是标准周期。 1月至3月,4月至6月等2015年6月21日属于第2季度,第2季度的开始月份为4月或4月。
opening_month(1,6)
[1] 4
在这种情况下我的功能很好。
opening_month(2,6)
[1] 5
在这种情况下,我的功能也很好用。
从2月份开始的季度,周期为2月至4月,5月至7月等。第6季度为Jun,第5季度为5月或5月。
opening_month(6,3)
[1] 3
这也是正确的。在这种情况下,季度从6月6月到8月,9月到11月,12月到2月,3月到5月。这是第四季度,起始月份是Mar本身。
在某些情况下,我的功能可以正常工作。
opening_month(6,1)
[1] 3
在这种情况下,季度从6月6月到8月,9月到11月,12月到2月。它是第3季度,起始月份应该是12月。但是函数给出了Mar或月3号的结果。
我知道这里的限制。我的函数没有捕获月份的循环关系。它不知道Dec在Jan之前,周期是1月到12月到1月的循环。
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
我已经编写了一些目前正在运行的代码,但我确信可以编写更好(高效)的代码。
opening_month = function(s, c) {
return(
ifelse(s==c, s,
ifelse(s<c, s+3*floor((c-s)/3),
ifelse(
(s+3*floor((c+12-s)/3))>12,
s+3*floor((c+12-s)/3)-12,
s+3*floor((c+12-s)/3)
)
)
)
)
}
以下是一些样本obervations的结果
> opening_month(1,2)
[1] 1
> opening_month(1,5)
[1] 4
> opening_month(6,5)
[1] 3
> opening_month(6,1)
[1] 12
> opening_month(10,2)
[1] 1