2012-02-29 22 views
13

Ho un [r] quadro dati grande con variabili di data, che riflettono il primo giorno del mese. È un modo semplice per crare una nuova variabile data frame data che rappresenta l'ultimo giorno del mese?Metodo per creare la data di fine mese dalla variabile data in [r] frame dati

Di seguito è riportato alcuni dati di esempio:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months") 
df=data.frame(date.start.month) 
df$date.start.month 

"2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" 

Vorrei restituire un nuovo addebbitato variabile:

"2012-01-31" "2012-02-29" "2012-03-30" "2012-04-27" 

Ho provato il follwing ma era unsucessful:

df$date.end.month=seq(df$date.start.month,length=1,by="+1 months") 

Qualsiasi consiglio per questo nuovo utente [r] sarebbe molto apprezzato.

+0

L'output di esempio non corrisponde alla domanda. – James

+1

Si potrebbe anche considerare l'uso della classe "yearmon" 'che rappresenta l'anno/mese senza aver bisogno di un giorno in primo luogo:' biblioteca (zoo); ym <- as.yearmon ("2012-01") + 0: 3/12'. Se volevi le date l'ultimo giorno del mese, allora 'as.Date (ym, frac = 1)'. –

+0

G.Grothendieck: Grazie per il suggerimento, dovrò ricordare di utilizzare la classe yearmon per questo tipo di dati di date in futuro. – MikeTP

risposta

15

Per ottenere la fine dei mesi, è sufficiente creare un vettore Date contenente il 1 ° di tutti i mesi successivi e sottrarre 1 giorno.

date.end.month <- seq(as.Date("2012-02-01"),length=4,by="months")-1 
date.end.month 
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" 
+0

Grazie James, ma questo non sembrava funzionare all'interno della struttura del frame dei dati. – MikeTP

+0

libreria (lubridate) date.start.month = seguenti (as.Date ("2012-01-01"), lunghezza = 4, per = "mesi") df = data.frame (date.start.month) df $ date.end.month = df $ date.start.month + mesi (1) -Days (1) df $ date.start.month df $ date.end.month "2012-01 -01 "" 2012-02-01 "" 2012-03-01 "" 2012-04-01 " " 2012-01-31 "" 2012-02-29 "" 2012-03-31 "" 2012-04 -30 " – MikeTP

+0

@MikeTP Sembra che funzioni per me, ma l'output di esempio è stato confuso: perché il 27 aprile? – James

6

Usa timeLastDayInMonth dal pacchetto timeDate:

df$eom<-timeLastDayInMonth(df$somedate) 
1

Una funzione, come di seguito sarebbe fare il lavoro (assumere dt è scalare) -

month_end <- function(dt) { 
    d <- seq(dt, dt+31, by="days") 
    max(d[format(d,"%m")==format(dt,"%m")]) 
} 

Se si dispone di un vettore di Date , quindi:

sapply(dates, month_end) 
4

Ecco un'altra soluzione utilizzando il pacchetto lubridate:

date.start.month=seq(as.Date("2012-01-01"),length=4,by="months") 
df=data.frame(date.start.month) 

library(lubridate) 
df$date.end.month <- ceiling_date(df$date.start.month, "month") - days(1) 
df$date.end.month 
[1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" 

Questo utilizza lo stesso concetto dato da James sopra, nel senso che ottiene il primo giorno del mese successivo e sottrae un giorno.

A proposito, funzionerà anche quando la data di inserimento non è necessariamente il primo giorno del mese. Quindi, ad esempio, oggi è il 27 del mese e restituisce ancora l'ultimo giorno corretto del mese:

ceiling_date(Sys.Date(), "month") - days(1) 
[1] "2017-07-31" 
Problemi correlati