[英]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.yearmon
从zoo
,之后再通过相同的转换转换为一个月的最后一天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)
在上述st
和en
可以是任何可转换为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.