[英]Last Day of Month Function, given Year and Month
在多次单步执行代码后,我无法找到具体给出此错误的内容。 我希望之前有人见过这个错误。
以下是我认为与问题相关的内容:
#### 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
。
这是两个解决方案。 即使year
和month
都是向量而不是这里显示的标量,两者都可以工作。
1)as.Date.yearmon首先将输入转换为"yearmon"
对象,然后使用带有frac=1
参数的as.Date
将其转换为"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)基础使用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"
另一种选择可能是使用Hmisc
库。 人们可以找到使用year
和month
后一个月内的最大天数,以及day=1
来确定日期。 然后找出该月的最大天数。
最后使用year
, month
和max 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"
调整自己的代码,并继续使用lubridate
:
last_day_of_mth <- function(YEAR, MONTH){
ymd(paste0(YEAR, "-", MONTH, "-1")) %>%
ceiling_date(., "month") %>%
{.-days(1)}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.