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'
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top