Genere una secuencia del último día del mes durante dos años
Pregunta
Utilizo lubridate y pensé que esto sería tan fácil
ymd("2010-01-31")+months(0:23)
Pero mira lo que uno obtiene. ¡Todo está desordenado!
[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"
Luego leí cómo el lubridato atiende al fenómeno como el intervalo, la duración y el período. Entonces, OK, me doy cuenta de que un mes es en realidad el número de días definidos por (365*4+1)/48 = 30.438 días. Así que intenté ser inteligente y reescribirlo como
ymd("2010-01-31")+ as.period(months(0:23))
Pero eso solo dio un error.
Error in as.period.default(months(0:23)) : (list) object cannot be coerced to type 'double'
Solución
Sí, encontraste el truco correcto: volver un día desde el primero de los próximo mes.
Aquí está como una línea de una línea en la 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>
Así que no hay necesidad de lubridar Lo cual (aunque es un paquete bueno) no es necesario para tareas simples como esta. Además, su sobrecarga de funciones base existentes todavía me parece algo peligroso ...
Otros consejos
Es sorprendente cómo escribir una pregunta enfoca la energía creativa. Creo que descubrí la respuesta. También puedo publicarlo aquí para el próximo alma pobre que se encuentra perdiendo el tiempo.
ymd("2010-02-01")+ months(0:23)-days(1)
Simplemente especifique el primer día del próximo mes y genere una secuencia a partir de eso, pero reste 1 días para obtener el último día del mes 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"
Por cierto, ¿cómo me deshace de las molestas designaciones "UTC"? Las zonas horarias son un ahorro de vida cuando son necesarios. El resto del tiempo son una molestia.