这里有一些替代方案。它们都返回数值年份,但如果你真的需要以FY开头的字符串,可以使用
paste0("FY", ...)
,例如
paste0("FY", as.integer(as.yearmon(dates) - 4/12 + 1))
。它们都支持向量输入,即输入
dates
可以是一个向量。
1) zoo::as.yearmon zoo包中有一个
"yearmon"
类,它将年/月表示为年份+分数,其中分数为0表示一月,1/12表示二月,2/12表示三月,依此类推。
使用这个一行代码就可以完成。它减去4/12(因为四月是年底),然后加1(即加一年)。然后取整数部分即可得到年份:
library(zoo)
as.integer(as.yearmon(dates) - 4/12 + 1)
2) POSIXlt 这里有一个不使用任何包的解决方案。将日期转换为POSIXlt类。它的mo组件将一月表示为0,二月表示为1,以此类推。因此,如果我们是五月或之后(mo为4或更多),则财政年度为下一个日历年,否则为当前日历年。POSIXlt对象的year组件是自1900年以来的年数,因此如果我们是五月或之后,则将年份加到1900年上再加1:
lt <- as.POSIXlt(dates)
lt$year + (lt$mo >= 4) + 1900
3) 格式 如果月份大于或等于5,则将年份加1(如果不是,则加零)。这也不使用任何软件包:
as.numeric(format(dates, "%Y")) + (format(dates, "%m") >= "05")
4) substr。我们可以使用substr提取年份,转换为数字,并在提取的月份(也使用substr提取)为"05"或更大时加1。再次不使用任何包。
as.numeric(substr(dates, 1, 4)) + (substr(dates, 6, 7) >= "05")
5) read.table 这个函数也不使用任何包。
with(read.table(text = format(dates), sep = "-"), V1 + (V2 >= 5))
注意:我们将这个作为输入的“dates”使用了。
dates <- as.Date(c("2015-05-01", "2015-04-30", "2014-09-01"))