在两个日期之间创建一个包含所有日期的向量

98

在R中,是否有一种简单的方法可以列出在两个指定日期之间发生的所有有效日期?例如,我想输入以下内容:

itemizeDates(startDate="12-30-11", endDate="1-4-12")

为生成以下日期:

"12-30-11" "12-31-11", "1-1-12", "1-2-12", "1-3-12", "1-4-12"

我对课程和日期格式很灵活,我只需要该概念的实现。

3个回答

161
您正在寻找seq
> seq(as.Date("2011-12-30"), as.Date("2012-01-04"), by="days")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

或者,您可以使用:

> as.Date(as.Date("2011-12-30"):as.Date("2012-01-04"), origin="1970-01-01")
[1] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03"
[6] "2012-01-04"

请注意,使用冒号:时,“非数字参数在内部被强制转换”。因此,我们使用as.Date方法将其转换回Date类,针对“numeric”类,并提供origin


这是一个可以满足您特定需求的函数。

itemizeDates <- function(startDate="12-30-11", endDate="1-4-12", 
                         format="%m-%d-%y") {
  out <- seq(as.Date(startDate, format=format), 
             as.Date(endDate, format=format), by="days")  
  format(out, format)
}

> itemizeDates(startDate="12-30-11", endDate="1-4-12")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"

6
seq.Date 的作用我之前并不知道。 - Matthew Lundberg
1
的确是这样。谢谢你的帮助! - Jeff Allen
我必须说,这是我见过的更有效率的答案之一。 - d8aninja

18

我更喜欢使用lubridate包来解决日期时间问题。一旦你掌握了它,它会更加直观易懂且容易使用。

library(lubridate)
#mdy() in lubridate package means "month-day-year", which is used to convert
#the string to date object
>start_date <- mdy("12-30-11")
>end_date <- mdy("1-4-12")
#calculate how many days in this time interval
>n_days <- interval(start_date,end_date)/days(1)
>start_date + days(0:n_days)
[1]"2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04"
#convert to original format
format(start_date + days(0:n_days), format="%m-%d-%y")
[1] "12-30-11" "12-31-11" "01-01-12" "01-02-12" "01-03-12" "01-04-12"

参考文献: 使用lubridate轻松处理日期和时间


10

lubridate 中有两个类似的实现:

library(lubridate)

as_date(mdy("12-30-11"):mdy("1-4-12"))

# OR

seq(mdy("12-30-11"), mdy("1-4-12"), by = "days")

这些日期没有按月-日-年格式排版,但如果您希望,可以修复格式。但是,年-月-日在分析时更容易处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接