多次单步执行代码后,我无法找到具体导致此错误的原因。我希望有人以前见过这个错误。
以下是我认为与该问题相关的内容:
#### Load packages
library(lubridate)
MONTH <- 1
YEAR <- 2018
# Last day of month
last_day_of_mth <- function(YEAR, MONTH){
MONTH_BEGIN <- as.POSIXlt(paste0(YEAR, "-", MONTH, "-1"))
MONTH_END <- MONTH_BEGIN
day(MONTH_END) <- day(MONTH_BEGIN)
month(MONTH_END) <- month(MONTH_END) + 1
day(MONTH_END) <- day(MONTH_END) - 1
return(as.character(MONTH_END))
}
Run Code Online (Sandbox Code Playgroud)
此代码加载一堆外部文件,其中source()不包含任何其他包或其他函数。他们只是从 Google Analytics API 查询数据,或者加载 .csv 文件、操作数据帧,并以 .csv 文件形式输出适当的输出。
由于某些奇怪的原因,通过运行这 10 个文件后source(),它吐出
> last_day_of_mth(2018, 1)
[1] "2018-03-02 06:00:00"
Run Code Online (Sandbox Code Playgroud)
这显然是不正确的——它应该是2018-01-31。
这里有两个解决方案。即使year和month是向量而不是此处显示的标量,两者都可以工作。
1) as.Date.yearmon首先将输入转换为"yearmon"对象,然后使用参数将其转换为"Date"类。as.Datefrac=1
library(zoo)
# input
year <- 2018
month <- 2
ym <- as.yearmon(paste(year, month, sep = "-"))
as.Date(ym, frac = 1)
## [1] [1] "2018-02-28"
Run Code Online (Sandbox Code Playgroud)
2) 基础fom使用(第一个月)从R 中找出一个月的天数的基础解决方案如下。首先,我们将年份和月份转换为该月第一天"Date"的类对象dat1,并添加 32 天,这足以到达下个月。然后使用fom查找该月的第一天并减去 1 以获得输入年/月的最后一个日期。
fom <- function(x) as.Date(cut(x, "month"))
dat1 <- as.Date(paste(year, month, 1, sep = "-"))
fom(dat1 + 32) - 1
## [1] "2018-02-28"
Run Code Online (Sandbox Code Playgroud)