2010-02-12 30 views
29

Sto provando a creare cartelle per archiviare i dati. Voglio etichettare le cartelle con il giorno di quei dati nel pull.Come sottrarre/aggiungere giorni da/a una data?

Es. Tiro 5 giorni fa i dati da mysql voglio nominare la cartella la data di 5 giorni fa.

MySQL può facilmente gestire l'aritmetica delle date. Non sono sicuro di come R lo fa. Dovrei semplicemente sottrarre il numero appropriato di secondi in POSIXct e quindi convertire in POSIXlt per denominare la cartella MM_DD_YYYY?

O c'è un modo migliore?

risposta

61

Basta sottrarre un numero:

> as.Date("2009-10-01") 
[1] "2009-10-01" 
> as.Date("2009-10-01")-5 
[1] "2009-09-26" 

Poiché la classe Date ha solo giorni, appena si può fare aritmetica di base su di esso.

Se si desidera utilizzare POSIXlt per qualche motivo, allora si può utilizzare è slot:

> a <- as.POSIXlt("2009-10-04") 
> names(unclass(as.POSIXlt("2009-10-04"))) 
[1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" 
> a$mday <- a$mday - 6 
> a 
[1] "2009-09-28 EDT" 
+1

Oppure utilizzare POSIXct e sottrarre il valore di un giorno di secondi. 'trunc()' e 'round()' sono utili anche per tagliare oggetti POSIXt. – Sharpie

+0

ok che sembra il migliore finora. E per essere sicuri che gestisca correttamente le quantità e gli anni bisestili del mese? – Dan

+0

Sì, fa tutte queste cose correttamente. È possibile eseguire personalmente un test rapido impostando la data su DST (ad esempio) per confermare ciò in quanto ciascun approccio può avere un comportamento diverso. – Shane

31

La risposta probabilmente dipende da quale formato la data è in, ma qui è un esempio utilizzando la classe Date:

dt <- as.Date("2010/02/10") 
new.dt <- dt - as.difftime(2, unit="days") 

Si può anche giocare con diverse unità come settimane.

+2

Le unità valide per secondo tempo sono: "secondi", "minuti", "ore", "giorni", "settimane". – jbaums

6

C'è naturalmente una soluzione lubridate per questo:

library(lubridate) 
date <- "2009-10-01" 

ymd(date) - 5 
# [1] "2009-09-26" 

è lo stesso di

ymd(date) - days(5) 
# [1] "2009-09-26" 

Altri formati di orario possono essere:

ymd(date) - months(5) 
# [1] "2009-05-01" 

ymd(date) - years(5) 
# [1] "2004-10-01" 

ymd(date) - years(1) - months(2) - days(3) 
# [1] "2008-07-29" 
Problemi correlati