R语言tidyquant包EOMONTH函数偏移1月返回NA异常咨询
问题说明
在tidyquant 1.0.4版本下运行如下代码时,EOMONTH(sdt, 1)返回NA,预期应返回2019年2月28日;EOMONTH(sdt, 2)可正常返回结果,相同逻辑在Excel原生EOMONTH函数中运行无异常。
library(tidyquant) sdt <- as.Date("2019-01-31") EOMONTH(sdt, 1) EOMONTH(sdt, 2)
运行环境信息:
- R版本:4.1.2(Bird Hippie)
- tidyquant版本:1.0.4
结论
这是tidyquant 1.0.4版本中EOMONTH函数的实现bug,和使用方式无关。
该版本EOMONTH的内部计算逻辑存在疏漏:先将输入日期直接偏移指定月数,再取结果所在月的最后一天,没有处理「输入日期为当月月末,偏移后目标月份无对应日期」的场景。以输入2019-01-31、偏移1个月为例,内部先尝试计算2019-01-31加1个月的日期,2月不存在31日,这一步直接生成NA,后续取月末的逻辑没有做容错处理,最终返回NA;偏移2个月时3月存在31日,偏移步骤正常得到2019-03-31,取月末后结果正常。
Excel原生EOMONTH的逻辑是直接计算偏移n个月所在月份的最后一天,不会先做日期日度值的匹配,因此不会出现该问题。
临时替代方案
未升级到修复该问题的包版本前,可以使用如下自定义函数实现和Excel一致的EOMONTH逻辑:
EOMONTH <- function(date, offset = 0) { date <- as.Date(date) dt_lt <- as.POSIXlt(date) dt_lt$mon <- dt_lt$mon + offset dt_lt$mday <- 1 as.Date(dt_lt) - 1 }
测试验证:
EOMONTH(as.Date("2019-01-31"), 1)返回2019-02-28,符合预期EOMONTH(as.Date("2019-01-31"), 2)返回2019-03-31,和原函数正常场景结果一致
内容的提问来源于stack exchange,提问作者rmacey
相关产品推荐
相关产品推荐

