创建两个日期之间所有天数的向量

问题描述 投票:0回答:4

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"

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

r date sequence lubridate
4个回答
165
投票

您正在寻找

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"

请注意,

:
“非数字参数在内部强制”。因此,我们使用 'numeric' 类的
Date
方法转换回
as.Date
类,并提供
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"

19
投票

我更喜欢使用 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 轻松确定日期和时间


11
投票

lubridate
中的 2 个类似实现:

library(lubridate)

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

# OR

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

这些不会将您的日期格式化为月-日-年,但您可以根据需要修复格式。但分析时使用年月日有点容易。


0
投票

有几种方法可以使用

clock
包来做到这一点。

与许多其他答案一样,有一个排序功能,但是通过此功能,您可以更好地控制排序:

library(clock)

# every day between two dates
date_seq(from = Sys.Date(), to = Sys.Date() + 5, by = duration_days(1))
# [1] "2024-03-07" "2024-03-08" "2024-03-09" "2024-03-10" "2024-03-11" "2024-03-12"

# every other day between two dates
date_seq(from = Sys.Date(), to = Sys.Date() + 5, by = duration_days(2))
# [1] "2024-03-07" "2024-03-09" "2024-03-11"

# every 5th month until total size is 3
date_seq(from = Sys.Date(), by = duration_months(5), total_size = 3)
[1] "2024-03-07" "2024-08-07" "2025-01-07"

还有一组跨越函数,将从向量的最小值和最大值开始跨越:

x <- date_build(2024, c(3, 3, 3), c(7, 8, 11))
# [1] "2024-03-07" "2024-03-08" "2024-03-11"

# spans from min 2024-03-07 to max 2024-03-11
date_spanning_seq(x)
[1] "2024-03-07" "2024-03-08" "2024-03-09" "2024-03-10" "2024-03-11"

date_spanning_seq
使用日精度,因此没有太多控制。
calendar_spanning_seq
可以让您更好地控制如何跨越。

© www.soinside.com 2019 - 2024. All rights reserved.