如何在日期上使用 cut 函数

How to use cut function on dates

我有以下两个日期:

dates <- c("2019-02-01",   "2019-06-30")

我想根据以上两个日期创建以下分类:

2019-05-30, 2019-04-30, 2019-03-31, 2019-02-28 

我使用了 cut 函数和 seq,

dt <- as.Date(dates)

cut(seq(dt[1], dt[2], by = "month"), "month")

但这不会产生正确的结果。

能否请您说明一下 cut 函数在日期上的使用?

这里不用剪:

library(lubridate)
dates <- c("2019-02-01", "2019-06-30")
seq(min(ymd(dates)), max(ymd(dates)), by = "months") - 1
#> [1] "2019-01-31" "2019-02-28" "2019-03-31" "2019-04-30" "2019-05-31"

reprex package (v2.0.1)

于 2021-11-25 创建

我们假设需要的是 dates 中但不包括 2 个日期之间的所有月末。在问题中,dates[1] 是月初,dates[2] 是月末,但我们不假设如果我们这样做可能会简化。我们在下面生成了降序序列,但通常在 R 中使用升序。

下面的第一种方法使用每月序列和剪辑,下面第二种方法使用每日序列。

没有使用包。

1) 我们定义了一个月的第一天函数,fom,给定一个日期或字符日期,使用 cut 给出该月第一天的日期。然后我们计算两个日期的第一个月之间的每月日期,将它们转换为月末,然后删除任何不严格位于日期中的日期之间的日期。

fom <- function(x) as.Date(cut(as.Date(x), "month"))

s <- seq(fom(dates[2]), fom(dates[1]), "-1 month")
ss <- fom(fom(s) + 32) - 1
ss[ss > dates[1] & ss < dates[2]]
## [1] "2019-05-31" "2019-04-30" "2019-03-31" "2019-02-28"

2) 另一种方法是将 dates 的两个元素转换为 Date class 后计算每日序列,然后只保留第二天的那些有不同的月份,并且在日期中的日期之间。这个不用cut.

dt <- as.Date(dates)
s <- seq(dt[2], dt[1], "-1 day")
s[as.POSIXlt(s)$mon != as.POSIXlt(s+1)$mon & s > dt[1] & s < dt[2]]
## [1] "2019-05-31" "2019-04-30" "2019-03-31" "2019-02-28"