如何在日期上使用 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"
我有以下两个日期:
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"