Domanda

Io uso lubridate e pensato che questo sarebbe stato così facile

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

Ma sguardo ciò che si ottiene. E 'tutto incasinato!

 [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"

Poi ho leggere come Dedicato lubridate a fenomeni come l'intervallo, la durata e il periodo. Quindi, OK mi rendo conto che un mese è in realtà il numero di giorni definiti da (365 * 4 + 1) / 48 = 30,438 giorni. Così ho cercato di fare il furbo e riscrivere come

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

Ma che appena ha dato un errore.

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

Soluzione

Sì, avete trovato il giusto trucco: tornare un giorno dalla prima del il mese prossimo

.

Ecco come un one-liner di 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> 

Quindi nessun bisogno di lubridate che (pur essendo un pacchetto di fine) non è necessaria per semplice compito come questo. Inoltre, il suo sovraccarico di funzioni di base esistenti mi colpisce ancora come un po 'pericoloso ...

Altri suggerimenti

E 'incredibile come digitando una domanda si concentra energia creativa. Credo di aver lavorato fuori la risposta. Posso anche postare qui per la prossima povera anima che si trova il tempo di sprecare.

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

È sufficiente specificare il primo giorno del mese successivo e generare una sequenza da questo, ma sottrarre 1 giorno da esso per ottenere l'ultimo giorno del mese precedente.

[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"

A proposito, come faccio a sbarazzarsi del fastidioso "UTC" designazioni. I fusi orari sono un risparmiatore di vita quando sono necessari. Il resto del tempo sono un fastidio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top