如何在R中创建日期范围

28

从两个整数(1, 5)可以按照以下方式创建一个范围

1:5

[1] 1 2 3 4 5

如果给你两个日期 ("2014-09-04 JST", "2014-09-11 JST"),你如何生成一个日期范围?

输出必须是

[1] ("2014-09-04 JST", "2014-09-05 JST", "2014-09-06 JST", "2014-09-07 JST", "2014-09-08 JST")


1
如果你有一个时区,那么它们不是日期而是日期时间。每个类都有seq方法。 - IRTFM
你能回答一下关于日期和时区的问题吗? - sjdh
@sjdh 请查看对jalapic答案的评论。 - IRTFM
@sjdh - 如果您能给一个答案打上勾来关闭问题,那就太好了。谢谢。 - jalapic
这里也有好的解决方案:https://dev59.com/AGYq5IYBdhLWcg3weQky - DirtStats
5个回答

44

这有帮助吗?

seq(as.Date("2014/09/04"), by = "day", length.out = 5)
# [1] "2014-09-04" "2014-09-05" "2014-09-06" "2014-09-07" "2014-09-08"

编辑:添加有关时区的内容

这适用于我的当前时区

seq(c(ISOdate(2014,4,9)), by = "DSTday", length.out = 5) 
#[1] "2014-04-09 08:00:00 EDT" "2014-04-10 08:00:00 EDT" "2014-04-11 08:00:00 EDT" "2014-04-12 08:00:00 EDT"
#[5] "2014-04-13 08:00:00 EDT"

编辑2:

OlsonNames()  # I used this to find out what to write for the JST tz - it's "Japan"

x <- as.POSIXct("2014-09-04 23:59:59", tz="Japan")
format(seq(x, by="day", length.out=5), "%Y-%m-%d %Z")

# [1] "2014-09-04 JST" "2014-09-05 JST" "2014-09-06 JST" "2014-09-07 JST" "2014-09-08 JST"

如何使用 format( seq(c(ISOdate(2014,4,9)), by = "DSTday", length.out = 5), "%Y-%m-%d %Z") - IRTFM
1
如果我给你这两个日期(“2014-09-04 JST”,“2014-09-11 JST”),你能构建一个序列吗?结果以JST为准?(如果你好奇,JST代表日本标准时间) - sjdh
不确定为什么这个被接受了。它没有回答问题。 “如果你有两个日期,你怎么能创建一个日期范围? - thelatemail

24

要仅使用起始日期和结束日期获取一系列日期(天数、周数等),您可以使用以下代码:

seq(as.Date("2014/1/1"), as.Date("2014/1/10"), "days”)

[1] "2014-01-01" "2014-01-02" "2014-01-03" "2014-01-04" "2014-01-05" "2014-01-06" "2014-01-07"
[8] "2014-01-08" "2014-01-09" "2014-01-10

2
seq(as.Date("2014/1/1"), as.Date("2014/1/10"),by="day") - David Fernández Incio
此外,原文中的智能引号正在进行其恶劣的业务。 - Barry DeCicco

0

这里有一个答案,虽然比@jalapic的差,但不使用seq,而是使用for循环:

date1 <- "2014-09-04"
date2 <- "2014-09-11"
dif <- as.numeric(abs(as.Date(date1) - as.Date(date2)))
dates <- vector()
for (i in 1:dif) {
  date <- (as.Date(date1) + i)
  dates <- append(dates, date)
}
# [1] "2014-09-05" "2014-09-06" "2014-09-07" "2014-09-08" "2014-09-09" "2014-09-10" "2014-09-11

3
这并不需要使用循环。 - nrussell

0

这里有一个问题,时区JST无法被我的系统识别。

d1<-ISOdate(year=2014,month=9,day=4,tz="GMT")
seq(from=d1,by="day",length.out=5)
[1] "2014-09-04 12:00:00 GMT" "2014-09-05 12:00:00 GMT" "2014-09-06 12:00:00 GMT" "2014-09-07 12:00:00 GMT" "2014-09-08 12:00:00 GMT"


0

虽然在几乎所有情况下使用seq(date1, date2, "days")是更好的选择,但我想补充一下,如果您需要从某个日期开始n天的日期范围,则以下方法也可以:

1:10 + as.Date("2020-01-01")

# [1] "2020-01-02" "2020-01-03" "2020-01-04" "2020-01-05"
# [5] "2020-01-06" "2020-01-07" "2020-01-08" "2020-01-09"
# [9] "2020-01-10" "2020-01-11"

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