这里有一些替代方案。它们都返回数字年份,但如果您真的需要一个以 FY 开头的字符串,请使用paste0("FY", result),其中result 是以下任何结果。它们都支持向量输入,即输入dates可以是向量。
1) zoo::as.yearmon zoo 包有一个 "yearmon" 类,表示年/月为年 + 分数,其中分数 = 0 表示 1 月,1/12 表示 2 月,2 /12 三月等。
使用这个单线就可以了。它减去 4/12(因为 4 月是年末)并加 1(即加一年)。然后获取年份取整数部分:
library(zoo)
as.integer(as.yearmon(dates) - 4/12 + 1)
## [1] 2016 2015 2015
2) POSIXlt 这是一个不使用任何包的解决方案。将日期转换为 POSIXlt 类。 mo 组件表示 Jan 为 0,Feb 为 1 等,所以如果我们是 5 月或更晚(mo 为 4 或更多),则会计年度为下一个日历年,否则为当前日历年。 POSIXlt 对象的year 组件是自 1900 年以来的年数,因此如果我们在 5 月或更晚,则将年份添加到 1900 加 1:
lt <- as.POSIXlt(dates)
lt$year + (lt$mo >= 4) + 1900
## [1] 2016 2015 2015
3) 格式 如果月份大于或等于 5,则将年份加到 1(否则加到零)。这也没有使用任何包:
as.numeric(format(dates, "%Y")) + (format(dates, "%m") >= "05")
## [1] 2016 2015 2015
4) substr。我们可以使用substr提取年份,如果提取的月份(也使用substr提取)为“05”或更大,则转换为数字并加1。同样没有使用任何包。
as.numeric(substr(dates, 1, 4)) + (substr(dates, 6, 7) >= "05")
## [1] 2016 2015 2015
5) read.table 这也不使用任何包。
with(read.table(text = format(dates), sep = "-"), V1 + (V2 >= 5))
## [1] 2016 2015 2015
注意:我们使用这个作为输入dates:
dates <- as.Date(c("2015-05-01", "2015-04-30", "2014-09-01"))