1) дата последовательности. Обратите внимание, что в июне всего 30 дней, поэтому он не может дать 31 июня, вместо этого он дает 1 июля.
seq(as.Date("2012/12/31"), length = 2, by = "-6 months")[2]
## [1] "2012-07-01"
Если бы мы знали, что это конец месяца, мы могли бы сделать это:
seq(as.Date(cut(as.Date("2012/12/31"), "month")), length=2, by="-5 month")[2]-1
## "2012-06-30"
2) год. Кроме того, если бы мы знали, что это конец месяца, мы могли бы использовать класс "yearmon"
пакета zoo следующим образом:
library(zoo)
as.Date(as.yearmon(as.Date("2012/12/31")) -.5, frac = 1)
## [1] "2012-06-30"
Это преобразует дату в "yearmon"
, вычитает 6 месяцев (0,5 года), а затем преобразует ее обратно в "Date"
, используя frac=1
, что означает конец месяца (frac=0
означает начало месяца). Это также имеет то преимущество перед предыдущим решением, что оно автоматически векторизуется, т.е. as.Date(...)
мог быть вектором дат.
Обратите внимание, что если класс "Date"
используется только как способ представления месяцев, то мы можем полностью избавиться от него и напрямую использовать "yearmon"
, поскольку он моделирует то, что нам нужно в первую очередь:
as.yearmon("2012-12") - .5
## [1] "Jun 2012"
3) мондата. Третье решение — это пакет mondate, преимущество которого в том, что он возвращает конец месяца 6 месяцев назад, не зная, что наступил конец месяца:
library(mondate)
mondate("2011/12/31") - 6
## mondate: timeunits="months"
## [1] 2011/06/30
Это тоже векторизовано.
4) смазывать. Этот ответ на смазку был изменен в соответствии с изменениями в пакете:
library(lubridate)
as.Date("2012/12/31") %m-% months(6)
## [1] "2012-06-30"
lubridate также векторизован.
5) sqldf/SQLite
library(sqldf)
sqldf("select date('2012-12-31', '-6 months') as date")
## date
## 1 2012-07-01
или если бы мы знали, что мы в конце месяца:
sqldf("select date('2012-12-31', '+1 day', '-6 months', '-1 day') as date")
## date
## 1 2012-06-30
person
G. Grothendieck
schedule
07.03.2011
lubridate
и был обновлен. - person Uwe   schedule 05.01.2017