每月的最后一天功能,给出年份和月份

时间:2018-02-19 17:24:42

标签: 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))
}

此代码通过source()加载一堆外部文件,这些文件不包含任何其他软件包或其他功能。他们只是从Google Analytics API查询数据,或者他们加载.csv文件,操纵数据框,并将适当的输出作为.csv文件吐出。

由于某些奇怪的原因,在通过source()运行这10个文件后,它会吐出来

> last_day_of_mth(2018, 1)
[1] "2018-03-02 06:00:00"

显然不正确 - 它应该是2018-01-31

3 个答案:

答案 0 :(得分:3)

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

1)as.Date.yearmon 首先将输入转换为"yearmon"对象,然后使用"Date"将其转换为as.Datefrac=1 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"

2)base 使用来自Find out the number of days of a month in Rfom(月初)的基本解决方案如下。首先,我们将当月的第一个月份和月份转换为"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"

答案 1 :(得分:0)

另一种选择可能是使用Hmisc库。使用yearmonthday=1一起制作日期后,可以查看一个月内的最大天数。然后找出该月的最大天数。

最后使用yearmonthmax number of days in month来确定该月的最后日期。

我创建了一个lastDayofMonth

的函数
library(Hmisc)
lastDayofMonth <- function(year, month){
  as.Date(sprintf("%4d-%2d-%2d", year, month,
           monthDays(as.Date(sprintf("%4d-%2d-%2d", year, month, 1)))
         ))
}

> lastDayofMonth(2018,2)
#[1] "2018-02-28"
> lastDayofMonth(2018,3)
#[1] "2018-03-31"
> lastDayofMonth(2017,3)
#[1] "2017-03-31"
> lastDayofMonth(2000,2)
#[1] "2000-02-29"

答案 2 :(得分:0)

调整您自己的代码,并继续使用lubridate

last_day_of_mth <- function(YEAR, MONTH){
  ymd(paste0(YEAR, "-", MONTH, "-1")) %>% 
    ceiling_date(., "month") %>% 
    {.-days(1)}
}