繁体   English   中英

在R中生成每月最后一天的日期序列

[英]generate a date sequence of last day of month in R

如果我提供开始日期和结束日期以及频率,则我应该能够生成从开始到结束的一系列日期,以便

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)

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

我们可以改变的起始日期和结束日期月份开始做之前seq使用as.yearmonzoo ,之后再通过相同的转换转换为一个月的最后一天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"

这给出了从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 as.Date("2000-02-01")

如果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不是在月底时减去1/12,则用as.yearmon(st)替换为

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM