Gere uma sequência do último dia do mês ao longo de dois anos

Eu uso o lubridato e percebi que isso seria tão fácil

ymd("2010-01-31")+months(0:23) 

Mas olhe o que se recebe. Está tudo bagunçado!

  [1] "2010-01-31 UTC" "2010-03-03 UTC" "2010-03-31 UTC" "2010-05-01 UTC" "2010-05-31 UTC" "2010-07-01 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-10-01 UTC" [10] "2010-10-31 UTC" "2010-12-01 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-03-03 UTC" "2011-03-31 UTC" "2011-05-01 UTC" "2011-05-31 UTC" "2011-07-01 UTC" [19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-10-01 UTC" "2011-10-31 UTC" "2011-12-01 UTC" "2011-12-31 UTC" 

Então eu li como o lubrificante atende a fenômenos como intervalo, duração e período. Então, OK, percebo que um mês é, na verdade, o número de dias definido por (365 * 4 + 1) / 48 = 30,438 dias. Então eu tentei ser inteligente e reescrevê-lo como

 ymd("2010-01-31")+ as.period(months(0:23)) 

Mas isso só deu um erro.

 Error in as.period.default(months(0:23)) : (list) object cannot be coerced to type 'double' 

Sim, você encontrou o truque correto: voltar um dia a partir do primeiro dia do mês seguinte .

Aqui é como um one-liner na base R:

 R> seq(as.Date("2010-02-01"), length=24, by="1 month") - 1 [1] "2010-01-31" "2010-02-28" "2010-03-31" "2010-04-30" "2010-05-31" [6] "2010-06-30" "2010-07-31" "2010-08-31" "2010-09-30" "2010-10-31" [11] "2010-11-30" "2010-12-31" "2011-01-31" "2011-02-28" "2011-03-31" [16] "2011-04-30" "2011-05-31" "2011-06-30" "2011-07-31" "2011-08-31" [21] "2011-09-30" "2011-10-31" "2011-11-30" "2011-12-31" R> 

Portanto, não há necessidade de lubridate que (embora seja um bom pacote) não é necessário para tarefas simples como esta. Além disso, a sobrecarga de funções de base existentes ainda me parece um pouco perigosa …

É incrível como digitar uma pergunta foca a energia criativa. Eu acho que resolvi a resposta. Eu também posso postar aqui para a próxima pobre alma que se encontra perdendo tempo.

 ymd("2010-02-01")+ months(0:23)-days(1) 

Simplesmente especifique o primeiro dia do mês seguinte e gere uma sequência, mas subtraia 1 dia para obter o último dia do mês anterior.

 [1] "2010-01-31 UTC" "2010-02-28 UTC" "2010-03-31 UTC" "2010-04-30 UTC" "2010-05-31 UTC" "2010-06-30 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-09-30 UTC" [10] "2010-10-31 UTC" "2010-11-30 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-02-28 UTC" "2011-03-31 UTC" "2011-04-30 UTC" "2011-05-31 UTC" "2011-06-30 UTC" [19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-09-30 UTC" "2011-10-31 UTC" "2011-11-30 UTC" "2011-12-31 UTC" 

By the way, como faço para me livrar das designações “UTC” traquinas. Os fusos horários são um salva-vidas quando são necessários. O resto do tempo eles são um incômodo.