将日期分配到会计年度

Chu*_*kle 9 r lubridate dplyr

我正在尝试提供一些代码来查看日期,然后将其分配给会计年度.我完全陷入了困境.

我有一个包含POSIXct格式的日期的变量:

df$Date
#2015-05-01 CST
#2015-04-30 CST
#2014-09-01 CST
Run Code Online (Sandbox Code Playgroud)

我需要做的是采取这些日期并返回从5月1日到4月30日的财政年度.例如,2016财年运行2015-05-01到2016-04-30.结果看起来像这样:

df$Date                df$FiscalYear
#2015-05-01 CST        #FY2016
#2015-04-30 CST        #FY2015
#2014-09-01 CST        #FY2015
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来做到这一点?

G. *_*eck 17

这是一些替代方案.他们都返回数字年,但如果你真的需要一个字符串开始FY然后使用paste0("FY", result)其中result任何下面的结果.它们都支持向量输入,即输入dates可以是向量.

1)zoo :: as.yearmon动物园包有一个"yearmon"类,表示年/月为年+分数,其中分数= 0表示jan,1/12表示feb,2/12表示3月等等.

使用这个单行将会做到这一点.它减去4/12(自4月以来年末)并增加1(即增加一年).然后获取年份取整数部分:

library(zoo)

as.integer(as.yearmon(dates) - 4/12 + 1)
## [1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

2)POSIXlt这是一个不使用任何包的解决方案.将日期转换为POSIXlt类.它的mo组成部分代表Jan为0,2月为1,等等.因此,如果我们是5月或更晚(mo4或更多),那么会计年度是下一个日历年,否则它是当前日历年.yearPOSIXlt对象的组件是自1900年以来的年数,因此如果我们在5月或更晚时将年份添加到1900加1:

lt <- as.POSIXlt(dates)
lt$year + (lt$mo >= 4) + 1900
## [1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

3)格式如果月份大于或等于5,则将年份添加到1(如果不是,则将年份添加到零).这也不使用包:

as.numeric(format(dates, "%Y")) + (format(dates, "%m") >= "05")
## [1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

4)substr.我们可以提取年份substr,转换为数字,如果提取的月份(也使用提取substr)为"05"或更高,则加1 .同样没有使用包.

as.numeric(substr(dates, 1, 4)) + (substr(dates, 6, 7) >= "05")
## [1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

5)read.table 这也不使用包.

with(read.table(text = format(dates), sep = "-"), V1 + (V2 >= 5))
## [1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

注意:我们使用它作为输入dates:

dates <- as.Date(c("2015-05-01", "2015-04-30", "2014-09-01"))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢GG。英国相当于我认为`as.numeric(format(dates, "%Y")) - (format(dates, "%m") &lt;= "03")` (2认同)

Tun*_*unn 8

加入G.格洛腾迪克的好回应.用lubridate:

year(dates) + (month(dates) >= 5)
Run Code Online (Sandbox Code Playgroud)


Gre*_*now 7

您可以使用seqPOSIXct对象生成跨越数据的年份的"分界点"或会计年度的第1天的列表,然后用于findInterval计算特定日期所属的时间间隔:

> dates <- as.POSIXct( c('2015-05-01','2015-04-30','2014-09-01'))
> fy.tmp <- seq( as.POSIXct('2000-05-01'), length=25, by='year')
> fiscalYear <- (2001:2025)[ findInterval(dates,fy.tmp) ]
> fiscalYear
[1] 2016 2015 2015
Run Code Online (Sandbox Code Playgroud)

如果您想要一个因子作为结果,您也可以使用该cut函数findInterval.