首页 文章

带负数的日期序列

提问于
浏览
6

如何获得在给定月份结束且具有给定长度的一系列月度日期?假设开始日期是 seq(as.Date(*), length, by="month") ,而不是结束日期,并且AFAIK在这种情况下无法为 by 指定负值 .

ETA:也就是说,我想要一个跨越给定时间段的序列,但是要指定一个终点而不是起点 . 所以,像 seq(to="2000-03-01", len=3, by="month") --> 2000-01-01, 2000-02-01, 2000-03-01 .

4 回答

  • 0

    试试这个:

    rev(seq(as.Date("2000-03-01"), length = 3, by = "-1 month"))
    ## [1] "2000-01-01" "2000-02-01" "2000-03-01"
    
  • 5
    library(lubridate)
    ymd('2011-03-03') - months(0:5)
    
  • 0

    也许你可以将它向前计算,使用 by=month 作为1增量,然后反转:

    R> rev(seq(as.Date("2011-01-01"), length=6, by="month"))
    [1] "2011-06-01" "2011-05-01" "2011-04-01" "2011-03-01" "2011-02-01" "2011-01-01"
    
  • 13

    干得好 . 仅基本功能:

    last.days.of.month <- function(dt) {ldt<- as.POSIXlt(dt)
                                                  ldt$mon <- ldt$mon+1
                                                  ldt$mday <- 1
                                         return(format( ldt -1, "%Y-%m-%d"))}
     last.days.of.month(as.Date(c("2010-01-06","2010-03-06", "2010-02-06"))  )
    # [1] "2010-01-31" "2010-03-31" "2010-02-28"
    
     seq.ldom <- function(dt, nmonths) {ldt<- rep(as.POSIXlt(dt)[1], nmonths) 
                                        ldt$mon <- ldt$mon+seq(1:nmonths)
                                        ldt$mday <- 1
                            return(format( ldt -1, "%Y-%m-%d"))}
     seq.ldom(as.Date("2010-01-06"), 5)
    #[1] "2010-01-31" "2010-02-28" "2010-03-31" "2010-04-30"
    #[5] "2010-05-31"
    

    哦,出于某种原因,我以为你想要这个月的最后几天 . 抱歉无用的代码 . 这个月的头几天并不难 .

    seq.fdom <- function(dt, nmonths) {ldt<- rep(as.POSIXlt(dt)[1], nmonths) 
                                            ldt$mon <- ldt$mon+seq(0:(nmonths-1))
                                            ldt$mday <- 1
                                return(format( ldt , "%Y-%m-%d"))}
    seq.fdom(as.Date("2010-01-06"), 5)
    #[1] "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
    #[5] "2010-06-01"
    

    前几个月要么:

    seq.prior.fdom <- function(dt, nmonths) {ldt<- rep(as.POSIXlt(dt)[1], nmonths) 
                                             ldt$mon <- ldt$mon-rev(0:(nmonths-1))
                                             ldt$mday <- 1
                                 return(format( ldt , "%Y-%m-%d"))}
          seq.prior.fdom(as.Date("2010-01-06"), 5)
    #[1] "2009-09-01" "2009-10-01" "2009-11-01" "2009-12-01"
    #[5] "2010-01-01"
    

    我认为基本原则是明确的(如果没有用独木舟划桨打死) .

相关问题