Describiendo huecos en una serie temporal de pandas.

Estoy intentando escribir una función que toma una serie de tiempo continua y devuelve una estructura de datos que describe los huecos faltantes en los datos (por ejemplo, un DF con las columnas ‘inicio’ y ‘final’). Parece un problema bastante común para las series de tiempo, pero a pesar de jugar con groupby, diff y similares, y explorar SO, no he podido encontrar mucho mejor que el siguiente.

Es una prioridad para mí que este uso de las operaciones vectorizadas para seguir siendo eficiente. Tiene que haber una solución más obvia utilizando operaciones vectorizadas, ¿no es así? Gracias por cualquier ayuda, amigos.

import pandas as pd def get_gaps(series): """ @param series: a continuous time series of data with the index's freq set @return: a series where the index is the start of gaps, and the values are the ends """ missing = series.isnull() different_from_last = missing.diff() # any row not missing while the last was is a gap end gap_ends = series[~missing & different_from_last].index # count the start as different from the last different_from_last[0] = True # any row missing while the last wasn't is a gap start gap_starts = series[missing & different_from_last].index # check and remedy if series ends with missing data if len(gap_starts) > len(gap_ends): gap_ends = gap_ends.append(series.index[-1:] + series.index.freq) return pd.Series(index=gap_starts, data=gap_ends) 

Para el registro, Pandas == 0.13.1, Numpy == 1.8.1, Python 2.7

Este problema se puede transformar para encontrar los números continuos en una lista. encuentre todos los índices donde la serie es nula, y si una corrida de (3,4,5,6) es nula, solo necesita extraer el inicio y el final (3,6)

 import numpy as np import pandas as pd from operator import itemgetter from itertools import groupby # create an example data = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17] s = pd.series( data, index=data) s = s.reindex(xrange(18)) print find_gap(s) def find_gap(s): """ just treat it as a list """ nullindex = np.where( s.isnull())[0] ranges = [] for k, g in groupby(enumerate(nullindex), lambda (i,x):ix): group = map(itemgetter(1), g) ranges.append((group[0], group[-1])) startgap, endgap = zip(* ranges) return pd.series( endgap, index= startgap ) 

referencia: identificar grupos de números continuos en una lista