【问题标题】:adding 1 month to a date [duplicate]将1个月添加到日期[重复]
【发布时间】:2013-07-14 21:51:16
【问题描述】:

我想通过在startDate 中添加 1 个月来获取 startDateendDate 之间的日期序列。即,如果startDate 是 2013-01-31 而endDate 是 2013-07-31,我希望看到这样的日期:

"2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31" "2013-06-30" "2013-07-31"

我试过了

seq.Date(as.Date("2013-01-31"),by="month",length.out=7)

但是这段代码的输出是这样的

> seq.Date(as.Date("2013-01-31"),by="month",length.out=7)
[1] "2013-01-31" "2013-03-03" "2013-03-31" "2013-05-01" "2013-05-31" "2013-07-01" "2013-07-31"

那么,获得正确输出的最简单解决方案是什么?

【问题讨论】:

  • 如果您使用月度数据,最简单的解决方案是使用 zoo 的 yearmon 类。

标签: r dataframe date xts zoo


【解决方案1】:

这是行不通的,因为 R 不确定如何处理当月的最后一天。所以我有一个简单的解决方案:做同样的事情,但使用下个月的第一天,然后减去 1:

seq(as.Date("2013-02-1"),by="month",length.out=7) - 1
[1] "2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31" "2013-06-30" "2013-07-31"

【讨论】:

  • bug 错误.....它不适用于 date="2013-01-30" > seq(as.Date("2013-01-30")+1,by="月",length.out=7)-1 [1] "2013-01-30" "2013-03-02" "2013-03-30" "2013-04-30" "2013-05-30" " 2013-06-30" "2013-07-30"
  • 你想做什么?获取该月的倒数第二天?如果是这样,请使用 seq(as.Date("2013-02-1"),by="month",length.out=7)-2 [1] "2013-01-30" "2013-02-27" " 2013-03-30" "2013-04-29" "2013-05-30" "2013-06-29" "2013-07-30"
  • yyyy/mm/dd,yyyy/mm+1/dd,yyyy/mm+2/dd..这种格式..如果日期无效,则使用前一个有效日期(即,2013-02-31 应转换为 2013-02-28)
【解决方案2】:

我必须在 R 中处理日期,我发现的最有用的日期数据包之一是 lubridate。对于您的问题,您可以简单地执行以下操作:

require(lubridate)
# ymd function parses dates in year-month-day format
startDate <- ymd('2013-01-31')
# The %m+% adds months to dates without exceeding the last day
myDates <- startDate %m+% months(c(0:6))

lubridate 还有很多其他的日期功能,强烈推荐看看。

【讨论】:

  • 但是,它在 2 月后不起作用。 as.Date("2019-02-28") %m-% months(6) 给我一个输出为"2018-11-28"
  • @BruceWayne 在处理日期时有一些极端情况。对于您的示例,可能是因为不清楚用户是想要一个月的第 28 天还是一个月的最后一天。一种更安全的方法是使用当月的第一天并减去一天,就像其他答案一样。对于你的例子,as.Date("2019-03-01") %m-% months(6) - days(1) 会给你"2018-08-31"
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2014-09-08
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多