【问题标题】:Transforming Calendar Quarter to Financial Quarter将日历季度转变为财务季度
【发布时间】:2017-09-08 03:40:09
【问题描述】:

我正在使用包含每个日历季度产品交易数量的日期框架 (INPUT)。第一列 (DATE) 包含格式为“2016 Q2”的日历季度。我想将此日期转换为财务季度格式,例如“2016/17 Q1”。财政年度从 4 月 1 日开始。

我想出了以下代码来完成这项工作,但我想知道是否有一个公式或更简洁的代码可以使用。

INPUT$FY_Date=character(nrow(INPUT))

for (i in 1:nrow(INPUT)) {
    INPUT$FY_Date[i]= if(substr(INPUT$DATE[i],7,7)==1)  paste(as.numeric(substr(INPUT$DATE[i],1,4))-1,"/",substr(INPUT$DATE[i],3,4)," Q4",sep="") else 

    paste(substr(INPUT$DATE[i],1,4),"/",  formatC(as.numeric(substr(INPUT$DATE[i],3,4))+1,width=2,format="d",flag=0)," Q",as.numeric(substr(INPUT$DATE[i],7,7))-1,sep="")
}     

我找不到任何以前的相关帖子,因此我将不胜感激。

【问题讨论】:

  • 请确保您的示例完整(包括输入)且可重现,以便其他人可以轻松地从您的问题中复制它并将其粘贴到他们的会话中以运行它。还要确保它们是最小的。数据框在这里无关紧要,只是分散了问题的核心。

标签: r date calendar transform financial


【解决方案1】:

使用 zoo 中定义的 "yearqtr" 类,我们可以在两行代码中完成。

转换为"yearqtr""yearqtr" 类使用 year + (qtr-1)/4 的内部表示,其中 qtr 是 1、2、3 或 4,因此添加 3/4 会将其转移到年末年度和财政季度。然后在代码的最后一行as.integer 将提取年终年份。 format 函数可用于获取其余部分,其中%y 表示 2 位数年份,%q 表示季度。

library(zoo)

# test input
yq <- c("2016 Q2", "2016 Q3", "2016 Q4", "2017 Q1")

fyq <- as.yearqtr(yq, format = "%Y Q%q") + 3/4
paste0(as.integer(fyq) - 1, format(fyq, "/%y Q%q"))

给予:

[1] "2016/17 Q1" "2016/17 Q2" "2016/17 Q3" "2016/17 Q4"

请注意,如果您不需要问题中显示的特定格式,您可以使用format(fyq) 代替最后一行或format(fyq, "%Y Q%q")

更新:小幅代码改进。

【讨论】:

  • G.格洛腾迪克;我运行您的代码并出现以下错误消息。 UseMethod("quarters") 中的错误:没有适用于 'quarters' 的方法应用于“yearqtr”类的对象
  • 可能会出现这样的错误消息,例如,如果您忘记发出library(zoo) 命令。确保您将代码复制并粘贴到我的答案中,与您的会话中显示的完全相同,并且您在 CRAN 上使用的是最新版本的 zoo。 “给予”之后的那一行正是我运行它时 R 输出的内容。
  • 你知道我应该使用哪种格式来回答我的问题吗? "2016/17 Q1" "2016/17 Q2" "2016/17 Q3" "2016/17 Q4"
  • 我可能不像您需要的那样,但我已将您的代码更改为绕过错误消息和格式问题 sprintf("%d/%s %s",as.integer(fyq) - 1, substr(as.integer(fyq),3,4), substr(fyq,6,8))
  • 我已经修改了最后一行,以便输出与问题中的完全相同。 substr 应该不需要。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多