2011-07-01 25 views
8

tengo objetos zoológico que se parecen:fecha Dividir en diferentes columnas de año, mes y día

cabeza (obs)

 Index pp 
1932-01-01 0 
1932-01-02 0.2 
1932-01-03 0 

y quiero dividir el índice en 3 columnas (años, meses y días en columnas separadas) entonces puedo hacer algunos análisis por día del mes usando ddply.

No sé si hace alguna diferencia, pero las fechas se ha creado usando:

dates <- as.Date(CET[,1], "%d-%m-%Y") 
obs <- xts(CET[,2], dates) 

donde CET es el archivo original con las fechas de la columna 1 y PP en la columna 2.

Gracias ¡por ayudar!

Respuesta

16

1) columnas. Podemos utilizar de lubridate year/month/day o de Chron month.day.year:

1a) columnas vía lubridate

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(lubridate) 
tt <- time(z) 
zz <- cbind(z, year = year(tt), month = month(tt), day = day(tt)) 

1b) columnas a través de Chron

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(chron) 
zz <- with(month.day.year(time(z)), zoo(cbind(z, day, month, year))) 

2) agregado . Sin embargo, no necesitamos crear columnas en primer lugar. Sólo podemos utilizar aggregate.zoo directamente con el objeto zoológico original, z, utilizando lubridate o Chron o simplemente usando yearmon del zoológico dependiendo de qué es lo que desea hacer:

2a) agregada usando lubridate

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(lubridate) 
aggregate(z, day, mean) 
aggregate(z, month, mean) 
aggregate(z, year, mean) 

2b) agregada usando Chron

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

library(chron) 
mdy <- month.day.year(time(z)) 

aggregate(z, mdy$day, mean) 
aggregate(z, mdy$month, mean) 
aggregate(z, mdy$year, mean) 

# or 
ct <- as.chron(time(z)) 

aggregate(z, days(ct), mean) 
aggregate(z, months(ct), mean) 
aggregate(z, years(ct), mean) 

# days(ct) and years(ct) can actually 
# be shortened to just days and years within the above context 
# (and that would work for months too except they would be out of order) 
aggregate(z, days, mean) 
aggregate(z, years, mean) 

2c) agregada usando yearmon

Si queremos resumir cada año/mes en lugar de agrupar todos los meses de enero juntos, todos los meses de febrero juntos, etc, entonces no necesitamos ni Chron ni lubridate sino que podemos utilizar zoológico de yearmon:

library(zoo) 
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999) 

aggregate(z, yearmon, mean) 
5

Usted puede tratar de:

CET$year <- format(CET[,1], "%Y") # year 
CET$month <- format(CET[,1], "%m") # month 
CET$day <- format(CET[,1], "%d") # day 
+1

gracias pero no funciona: 'Problemas con format.default (estructura (as.character (x) =, nombres de nombres (x), dIM = dim (x),: no válido 'recortar' argument' – sbg

+2

Parece que sus fechas fueron factores. Puede usar la función str() para asegurarse de que las fechas sean realmente fechas. –

7
dtstr <- as.character(index(CET)) 

CET$yr <- sapply(strsplit(dtstr, "-") , "[", 1) 
CET$mon <- sapply(strsplit(dtstr, "-") , "[", 2) 
CET$dt <- sapply(strsplit(dtstr, "-") , "[", 3) 
+0

gracias DWin, 'index (CET)' no funciona ('Error: no se pudo encontrar la funcion" Index "') pero cambiar a 'dtstr <- as.character (CET [, 1])', funciona! – sbg

+1

Me alegro de que lo haya llevado a donde lo necesita. Nota: La función se deletrea 'index', no' Index' –

2
require(lubridate) 
maindata1 <- cbind(maindata1, day=day(maindata1$Date), month=month(maindata1$date), year=year(maindata1$date)) 
+1

Agregue alguna explicación sobre el código, y no solo un volcado de código. –

Cuestiones relacionadas