【问题标题】:Last Day of Month Function, given Year and Month给定年份和月份的月份函数的最后一天
【发布时间】:2018-02-19 17:24:41
【问题描述】:

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

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

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

【问题讨论】:

  • 请删除本文中所有不​​相关的源代码。问题应该有minimal 代码。见minimal reproducible example
  • 抱歉,我没有注意到您在函数中使用了特定名称。我可以使用相同的函数名。

标签: r


【解决方案1】:

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

1) as.Date.yearmon 首先将输入转换为"yearmon" 对象,然后使用as.Datefrac=1 参数将其转换为"Date" 类。

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) 基础 使用来自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"

【讨论】:

  • 这比我拥有的要优雅很多。谢谢!
【解决方案2】:

另一个选项可能是使用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"

【讨论】:

    【解决方案3】:

    改编自己的代码,继续使用lubridate

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

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多