用lubridate :: month()编写矢量化函数以产生会计年度

乔恩·斯普林

我正在编写一个获取日期并输出(6月30日)会计年度月份的函数,其中7月是FY月1,8月是2,6月是12。

例如,给定两年的日期,我希望此数据的输出为c(1:12, 1:12)

data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
                              to   = as.Date("2021-06-01"),
                              by   = "month"))

我当前的功能是这个。它包括可选地允许输出标签的逻辑。

FY_mo <- function(date, label = F, abbrev = F) {
  a <- (5 + (lubridate::month(date) %% 12)) + 1
  CY_num = lubridate::month(date)
  ifelse(!label, a,
          ifelse(abbrev,
                  month.abb[CY_num],
                  month.name[CY_num]))
}

当我输入单个日期时,此方法有效。例如,此测试testthat通过:

test_that("FY_mo works on indiv input dates", {
  expect_equal(7, FY_mo(as.Date("2020-01-01")))
  expect_equal("January", FY_mo(as.Date("2020-01-01"), label = TRUE))
  expect_equal("Jan", FY_mo(as.Date("2020-01-01"), label = TRUE, abbrev = TRUE))
})

但是当我将其输入向量时,它不起作用。下面的代码输出所有“ 13”。

data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
                                             to =   as.Date("2021-06-01"),
                                             by = "month")) %>%
                 dplyr::mutate(FY_mo = FY_mo(perf_dt)) %>%
                 dplyr::pull(FY_mo)
#[1] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13

我的错在哪里 有没有更好的方法来构造函数以产生正确的矢量输出?

罗纳克·沙

这样并不是一个错误,但是由于我们正在ifelse此处检查条件并ifelse返回与相同长度的向量test由于我们test的长度为1(length(!label)),因此仅返回第一个值并对其进行回收。在这里,由于我们只有一个条件要检查,因此可以使用if/else代替,ifelse这样可以避免此问题。

FY_mo <- function(date, label = F, abbrev = F) {
  a <- match(lubridate::month(date), c(7:12, 1:6))
  CY_num = lubridate::month(date)
  if(!label) a
  else if (abbrev) month.abb[CY_num]
       else month.name[CY_num]       
}

data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
                              to =   as.Date("2021-06-01"),
                              by = "month")) %>%
  dplyr::mutate(FY_mo = FY_mo(perf_dt)) %>%
  dplyr::pull(FY_mo)

#[1] 1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用矢量化函数替换慢熊猫循环

来自分类Dev

Excel编制会计年度

来自分类Dev

会计年度和财政季度

来自分类Dev

Excel编制会计年度

来自分类Dev

带有串联的会计年度

来自分类Dev

用lubridate提取日

来自分类Dev

用Matlab进行矢量化编程

来自分类Dev

使用RankX函数计算每个会计年度每个实体ID的日期等级

来自分类Dev

用lubridate解析日期时间

来自分类Dev

将日期分配到会计年度

来自分类Dev

如何基于会计年度动态获取数据

来自分类Dev

将日期更改为会计年度

来自分类Dev

按会计年度划分的SQL组数据

来自分类Dev

如何在Python中使用会计年度值?

来自分类Dev

标识R中的yearmon对象的会计年度

来自分类Dev

粒度从会计年度更改为月份

来自分类Dev

如何按会计年度对熊猫数据分组?

来自分类Dev

在Excel中确定会计年度的星期

来自分类Dev

SQL上一个会计年度

来自分类Dev

确定一个会计年度的月数

来自分类Dev

日本会计年度的 MySQL 日期计算

来自分类Dev

SQL Server中所有会计年度(4月至3月)的会计年度报表

来自分类Dev

用矢量化双重求和的Pythonic方法

来自分类Dev

python pandas:从会计年度和月份中获得会计季度(对于英国)

来自分类Dev

python pandas:从会计年度和月份中获得会计季度(对于英国)

来自分类Dev

SQL Server:根据特定日期和日期范围选择会计年度

来自分类Dev

MYSQL中按类别分组的每个会计年度的期初和期末余额之和

来自分类Dev

SQL显示滚动4个月,寻找会计年度

来自分类Dev

在SQL时间范围之间获取记录的替代方法(计算会计年度)