我有以下兩個日期:
dates <- c("2019-02-01", "2019-06-30")
我想從以上兩個日期創建以下垃圾箱:
2019-05-30, 2019-04-30, 2019-03-31, 2019-02-28
我使用剪切功能和 seq,
dt <- as.Date(dates)
cut(seq(dt[1], dt[2], by = "month"), "month")
但這不會產生正確的結果。
你能解釋一下在日期上使用剪切功能嗎?
uj5u.com熱心網友回復:
我們假設需要的是所有月末之間但不包括dates. 在問題中,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)另一種方法是在轉換為Date類后計算日期的兩個元素之間的每日序列,然后只保留第二天具有不同月份并且在日期中的日期之間的那些。這不使用剪切。
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"
uj5u.com熱心網友回復:
這里不需要剪切:
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 包(v2.0.1)于 2021 年 11 月 25 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368185.html
