separar secuenciales poner para misma minutos manipulacion macro insertar ingresa horas hora grabar fechas fecha dato cuando consecutivas como arrastrar r time-series missing-data

secuenciales - manipulacion de fechas en r



Insertar filas para fechas/horas faltantes (7)

Creo que lo más fácil es establecer primero la fecha como ya se describió, convertirla en zoológico y luego establecer una fusión:

df$timestamp<-as.POSIXct(df$timestamp,format="%m/%d/%y %H:%M") df1.zoo<-zoo(df[,-1],df[,1]) #set date to Index df2 <- merge(df1.zoo,zoo(,seq(start(df1.zoo),end(df1.zoo),by="min")), all=TRUE)

El inicio y el final se proporcionan a partir de su df1 (datos originales) y está configurando, por ejemplo, min, como lo necesita para su ejemplo. all = TRUE establece todos los valores faltantes en las fechas faltantes a las NA.

Soy nuevo en R, pero he recurrido a él para resolver un problema con un gran conjunto de datos que estoy tratando de procesar. Actualmente tengo un conjunto de 4 columnas de datos (valores Y) contra marcas de tiempo de intervalos de minutos (mes / día / hora por año: min) (valores X) como se muestra a continuación:

timestamp tr tt sr st 1 9/1/01 0:00 1.018269e+02 -312.8622 -1959.393 4959.828 2 9/1/01 0:01 1.023567e+02 -313.0002 -1957.755 4958.935 3 9/1/01 0:02 1.018857e+02 -313.9406 -1956.799 4959.938 4 9/1/01 0:03 1.025463e+02 -310.9261 -1957.347 4961.095 5 9/1/01 0:04 1.010228e+02 -311.5469 -1957.786 4959.078

El problema que tengo es que faltan algunos valores de indicación de fecha y hora, por ejemplo, puede haber una brecha entre el 1/01/01/13 y el 1/01/01 / 0:27 y dichos espacios son irregulares a través del conjunto de datos. Necesito poner varias de estas series en la misma base de datos y dado que los valores perdidos son diferentes para cada serie, las fechas actualmente no se alinean en cada fila.

Me gustaría generar filas para estas marcas de tiempo faltantes y llenar las columnas Y con valores en blanco (sin datos, no cero), de modo que tengo una serie temporal continua.

Honestamente, no estoy muy seguro de por dónde empezar (¡realmente no utilicé R antes, así que aprendí a medida que avanzo!), Pero cualquier ayuda sería muy apreciada. Hasta ahora he instalado chron y zoo, ya que parece que podrían ser útiles.

¡Gracias!


El relleno de fecha se implementa en el paquete padr en R. Si almacena su marco de datos, con su variable de fecha y hora almacenada como POSIXct o POSIXlt . Todo lo que necesitas hacer es:

library(padr) pad(df_name)

Ver viñeta ("padr") o esta publicación de blog para su funcionamiento.


En caso de que desee sustituir los valores de NA adquiridos por cualquier método mencionado anteriormente con ceros, puede hacer esto:

df[is.na(df)] <- 0

(Originalmente quería comentar esto sobre la respuesta de Ibollar pero carezco de la reputación necesaria, así que publiqué como respuesta)


Esta es una vieja pregunta, pero solo quería publicar una forma de manejar esto, ya que encontré esta publicación mientras buscaba una respuesta a un problema similar. Me resulta más intuitivo y fácil de entender que el enfoque del zoológico.

library(dplyr) ts <- seq.POSIXt(as.POSIXct("2001-09-01 0:00",''%m/%d/%y %H:%M''), as.POSIXct("2001-09-01 0:07",''%m/%d/%y %H:%M''), by="min") ts <- seq.POSIXt(as.POSIXlt("2001-09-01 0:00"), as.POSIXlt("2001-09-01 0:07"), by="min") ts <- format.POSIXct(ts,''%m/%d/%y %H:%M'') df <- data.frame(timestamp=ts) data_with_missing_times <- full_join(df,original_data) timestamp tr tt sr st 1 09/01/01 00:00 15 15 78 42 2 09/01/01 00:01 20 64 98 87 3 09/01/01 00:02 31 84 23 35 4 09/01/01 00:03 21 63 54 20 5 09/01/01 00:04 15 23 36 15 6 09/01/01 00:05 NA NA NA NA 7 09/01/01 00:06 NA NA NA NA 8 09/01/01 00:07 NA NA NA NA

También usando dplyr, esto hace que sea más fácil hacer algo así como cambiar todos esos valores faltantes a otra cosa, lo cual fue muy útil para mí al trazar en ggplot.

data_with_missing_times %>% group_by(timestamp) %>% mutate_each(funs(ifelse(is.na(.),0,.))) timestamp tr tt sr st 1 09/01/01 00:00 15 15 78 42 2 09/01/01 00:01 20 64 98 87 3 09/01/01 00:02 31 84 23 35 4 09/01/01 00:03 21 63 54 20 5 09/01/01 00:04 15 23 36 15 6 09/01/01 00:05 0 0 0 0 7 09/01/01 00:06 0 0 0 0 8 09/01/01 00:07 0 0 0 0


Estaba buscando algo similar, donde en lugar de completar las indicaciones de fecha y hora faltantes, mi información era de meses y días. Así que quería generar una secuencia de meses que se adapte a los años bisiestos, etcétera. Yo utilicé lubridate :

date <- df$timestamp[1] date_list <- c(date) while (date < df$timestamp[nrow(df)]){ date <- date %m+% months(1) date_list <- c(date_list,date) } date_list <- format(as.Date(date_list),"%Y-%m-%d") df_1 <- data.frame(months=date_list, stringsAsFactors = F)

Esto me dará una lista de fechas en meses incrementales. Entonces me uno

df_with_missing_months <- full_join(df_1,df)


# some made-up data originaldf <- data.frame(timestamp=c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:04"), tr = rnorm(4,0,1), tt = rnorm(4,0,1)) originaldf$minAsPOSIX <- as.POSIXct(originaldf$timestamp, format="%m/%d/%y %H:%M", tz="GMT") # Generate vector of all minutes ndays <- 1 # number of days to generate minAsNumeric <- 60*60*24*243 + seq(0,60*60*24*ndays,by=60) # convert those minutes to POSIX minAsPOSIX <- as.POSIXct(minAsNumeric, origin="2001-01-01", tz="GMT") # new df newdf <- merge(data.frame(minAsPOSIX),originaldf,all.x=TRUE, by="minAsPOSIX")


df1.zoo <- zoo(df1[,-1], as.POSIXlt(df1[,1], format = "%Y-%m-%d %H:%M:%S")) #set date to Index: Notice that column 1 is Timestamp type and is named as "TS" full.frame.zoo <- zoo(NA, seq(start(df1.zoo), end(df1.zoo), by="min")) # zoo object full.frame.df <- data.frame(TS = as.POSIXlt(index(full.frame.zoo), format = "%Y-%m-%d %H:%M:%S")) # conver zoo object to data frame full.vancouver <- merge(full.frame.df, df1, all = TRUE) # merge