2010-02-12 15 views
29

Estoy intentando crear carpetas para almacenar datos extraídos. Quiero etiquetar las carpetas con el día de esos datos en la extracción.Cómo restar/agregar días de/a una fecha?

Ej. Extraigo datos de hace 5 días de mysql. Quiero nombrar la carpeta con la fecha de hace 5 días.

MySQL puede manejar fácilmente la aritmética de fechas. No estoy seguro de cómo lo hace R exactamente. ¿Debo simplemente restar el número apropiado de segundos en POSIXct y luego convertir a POSIXlt para nombrar la carpeta MM_DD_YYYY?

¿O hay una manera mejor?

Respuesta

61

Sólo resta un número:

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

Puesto que la clase Date solamente tiene días, sólo puede hacer operaciones aritméticas básicas en él.

Si desea utilizar POSIXlt por alguna razón, entonces se puede utilizar es ranuras:

> 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

O use POSIXct y reste el valor de un día de segundos. 'trunc()' y 'round()' también son útiles para recortar objetos POSIXt. – Sharpie

+0

bien que se ve como el mejor hasta ahora. ¿Y solo para estar seguro de que maneja correctamente las cantidades de diferentes días del mes y los años bisiestos? – Dan

+0

Sí, hace todas esas cosas correctamente. Puede hacer una prueba rápida usted mismo estableciendo la fecha alrededor del horario de verano (por ejemplo) para confirmar esto, ya que cada enfoque puede tener un comportamiento diferente. – Shane

31

La respuesta probablemente depende de qué formato de la fecha está en, pero aquí hay un ejemplo usando la clase Date:

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

Incluso se puede jugar con diferentes unidades, como semanas.

+2

Las unidades válidas para as.difftime son: "segundos", "minutos", "horas", "días", "semanas". – jbaums

6

Hay por supuesto una solución lubridate para esto:

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

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

es la misma que

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

Otros formatos de tiempo podrían ser:

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" 
Cuestiones relacionadas