给定年份和月份的月份函数的最后一天

Cla*_*ist 5 r

多次单步执行代码后,我无法找到具体导致此错误的原因。我希望有人以前见过这个错误。

以下是我认为与该问题相关的内容:

#### 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

G. *_*eck 6

这里有两个解决方案。即使yearmonth是向量而不是此处显示的标量,两者都可以工作。

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)