найти последний день месяца в последовательности дат - PullRequest
0 голосов
/ 31 августа 2018

У меня есть последовательность таких дат

ds <- seq(as.Date("2011-02-01"), length=100, by="day")

Я хочу найти индексы последних дней каждого месяца

Я могу сделать это так

last_day <- seq(as.Date("2011-02-01"), length=10, by="1 month") - 1

which(ds %in% last_day)

Моя проблема в том, что моя последовательность дат не завершена, некоторые даты отсутствуют, а иногда это может быть последний день.

Например, я убрал последний день февраля

ds[ds == as.Date('2011-02-28')] <- NA

Новый последний день теперь должен быть «2011-02-27».

Как я могу найти последний из каждого месяца на основе дат в моем векторе? Даты охватывают несколько лет.

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Использование endpoints из пакета xts:

ds <- seq(as.Date("2011-02-01"), length=100, by="day")
ds[ds == as.Date('2011-02-28')] <- NA


library(xts)
#need to remove NA's. xts can handle dates that are not there, but doesn't like NA's
ep <- endpoints(xts(ds[!is.na(ds)], order.by = ds[!is.na(ds)]), on = "months")
ds[ep]
[1] "2011-02-27" "2011-03-30" "2011-04-29" "2011-05-10"
0 голосов
/ 31 августа 2018

Попробуйте:

which(ave(as.numeric(ds),format(ds,"%Y%m"),FUN=function(x) x==max(x))==1)
0 голосов
/ 31 августа 2018

Функция nth_day в упаковке datetimeutils (что я поддерживаю) позволяет получить последний день месяца. Однако он не будет обрабатывать значения NA.

library("datetimeutils")
ds <- seq(as.Date("2011-02-01"), length = 100, by = "day")

nth_day(ds, n = "last")
## [1] "2011-02-28" "2011-03-31" "2011-04-30" "2011-05-11"

nth_day(ds, n = "last", index = TRUE)
## [1]  28  59  89 100
0 голосов
/ 31 августа 2018

Мы можем group_by месяц и выбрать max дату для каждого месяца

library(zoo)
library(dplyr)

data.frame(ds) %>%
  group_by(month = as.yearmon(ds)) %>%
  slice(which.max(ds))


#        ds         month        
#     <date>     <S3: yearmon>
#1 2011-02-27     Feb 2011     
#2 2011-03-31     Mar 2011     
#3 2011-04-30     Apr 2011     
#4 2011-05-11     May 2011  

Если нам нужны индексы, мы можем сделать

library(zoo) 
which(ds %in% unique(ave(ds, as.yearmon(ds), FUN = max)))
#[1] 27 58 88 99
...