【问题标题】:generate a date sequence of last day of month in R在R中生成月份最后一天的日期序列
【发布时间】:2018-05-16 08:43:40
【问题描述】:

如果我给出一个开始日期和结束日期,以及一个频率,我应该能够生成从开始到结束的一系列日期,这样

1) 日期是当月的最后一天。 2)我可以将序列频率设置为 12 的任何因子(12 个月)。假设频率为 3,则表示间隔或间隔为 4 个月。

对于 (1),以下函数为我提供了一个间隔为 3 个月(即每季度)的输出,但它没有给出该月最后一天的日期。

    DateSeq<-function(st,en, freq){
    seq(st, en, by = paste(as.character(12/freq), "months"))
    }
    DateSeq(as.Date("2015-01-01"),as.Date("2018-03-03"),4)

如何将其转换为最后一天给我的序列。?给我一个简单的代码。

【问题讨论】:

  • 或许DateSeq(as.Date("2015-02-01"),as.Date("2018-04-03"),4)-1
  • @akrun 这不是一个优雅的解决方案。
  • 对不起,我不知道你如何定义优雅。它只是从函数中减去 1。
  • 好的,那么你应该在帖子中提及它。我以为你的日期将是一个月的第一天
  • @akrun 把它写成答案

标签: r date sequence


【解决方案1】:

这给出了从st 的年/月到en 的年/月的一系列月末日期。

library(zoo)
as.Date(seq(as.yearmon(st), as.yearmon(en), by = 1 / freq), frac = 1)

在上面的sten 可以是任何转换为​​yearmon 的类,包括yearmon 本身、Date、字符串或数字。例如,"2000-02-01""2000-02"as.Date("2000-02-01")2000+1/12

如果en 是一个日期,并且序列的结束日期不应晚于en,则将as.yearmon(en) 替换为以下内容,如果en 不在月末,则减去1/12 .

as.yearmon(en) - (as.Date(en) < as.Date(as.yearmon(en), frac = 1)) / 12

类似地,如果st 是一个日期并且序列的开始日期不应晚于st,如果st 不是在月底替换@987654341,则使用相同的想法减去1/12 @与

as.yearmon(st) - (as.Date(st) < as.Date(as.yearmon(st), frac = 1)) / 12

关于我们是否真的需要日期存在一些问题,因为它们总是在月末。似乎关键是要创建一个年/月序列,而月末日期只是表示它的一种方式。 更简单的方法是直接使用这个yearmon 序列。

seq(as.yearmon(st), as.yearmon(en), by = 1 / freq)

【讨论】:

    【解决方案2】:

    我们可以在使用as.yearmonzoo 执行seq 之前将开始日期和结束日期更改为月初,然后通过as.yearmon 进行相同的转换将其转换为月份的最后一天

    library(zoo)
    DateSeq <- function(st, en, freq) {
      st <- as.Date(as.yearmon(st)) 
      en <- as.Date(as.yearmon(en)) 
      as.Date(as.yearmon(seq(st, en, by = paste(as.character(12/freq), "months"))), frac = 1)
    
     }
    DateSeq(as.Date("2015-01-31"),as.Date("2018-03-03"),4)
    #[1] "2015-01-31" "2015-04-30" "2015-07-31" "2015-10-31" "2016-01-31" "2016-04-30" "2016-07-31" "2016-10-31" "2017-01-31"
    #[10] "2017-04-30" "2017-07-31" "2017-10-31" "2018-01-31"
    

    【讨论】:

    • @G.Grothendieck 然后将其写为答案。似乎是更优雅的代码
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2012-01-10
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多