我希望从11月开始的会计年度(即会计年度的第一天是11月1日)中检索月份编号。下面的代码提供了我想要的输出,借用week_start
的lubridate::wday
语法,其中year_start
类似于week_start
:
library('lubridate')
dateToRetrieve = ymd('2017-11-05')
#output: [1] "2017-11-05"
monthFromDate = month(dateToRetrieve, year_start=11)
#output: [1] 1
由于此功能尚不存在,我正在寻找提供相同输出的替代解决方案。将period(10, units="month")
添加到每个日期不起作用,因为不同月份的长度导致问题在几个月之间转换(例如,3月31日减去一个月= 2月31日,这没有意义)。
我在lubridate github here上检查了一个类似的问题,但没有看到任何解决方案。有没有人有想法提供我想要的功能?
非常感谢,
1)lubridate下面x
可以是一个字符向量或Date
向量:
x <- "2017-11-05" # test data
(month(x) - 11) %% 12 + 1
## [1] 1
2)Base R要仅使用基数R执行此操作首先计算给出mx
的月份数,如图所示,然后执行相同的计算:
mx <- as.POSIXlt(x)$mon + 1
(mx - 11) %% 12 + 1
## [1] 1
这是一个不太漂亮的方式......但你可以创建一个从11月开始的月份矢量范围,调用日期对象的完整month
,然后match
两个对象一起得到矢量位置。
suppressPackageStartupMessages(library('lubridate'))
x <- format(ISOdate(2004,1:12,1),"%B")[c(11,12,1:10)]
match(as.character(month(ymd('2017-11-05'), label = TRUE, abbr = FALSE)), x)
#> [1] 1
match(as.character(month(ymd('2017-01-15'), label = TRUE, abbr = FALSE)), x)
#> [1] 3
match(as.character(month(ymd('2017-05-01'), label = TRUE, abbr = FALSE)), x)
#> [1] 7