seleccionar hacer filtrar datos como columnas columna agregar python python-2.7 pandas numpy scipy

python - hacer - Pandas cómo dividir dataframe por columna por intervalo



seleccionar columnas de un dataframe pandas (2)

Tengo un marco de datos gigantesco con una columna de tipo de fecha y hora llamada dt , el marco de datos ya está ordenado en base a dt . Quiero dividir el marco de datos en varios marcos de datos basados ​​en dt , cada marco de datos contiene filas dentro de 1 hr rango de 1 hr .

División

dt text 0 20160811 11:05 a 1 20160811 11:35 b 2 20160811 12:03 c 3 20160811 12:36 d 4 20160811 12:52 e 5 20160811 14:32 f

dentro

dt text 0 20160811 11:05 a 1 20160811 11:35 b 2 20160811 12:03 c dt text 0 20160811 12:36 d 1 20160811 12:52 e dt text 0 20160811 14:32 f


Necesita groupby por diferencia del primer valor de columna dt convertido a hour por astype :

S = pd.to_datetime(df.dt) for i, g in df.groupby([(S - S[0]).astype(''timedelta64[h]'')]): print (g.reset_index(drop=True)) dt text 0 20160811 11:05 a 1 20160811 11:35 b 2 20160811 12:03 c dt text 0 20160811 12:36 d 1 20160811 12:52 e dt text 0 20160811 14:32 f

List comprehension solución de List comprehension :

S = pd.to_datetime(df.dt) print ((S - S[0]).astype(''timedelta64[h]'')) 0 0.0 1 0.0 2 0.0 3 1.0 4 1.0 5 3.0 Name: dt, dtype: float64 L = [g.reset_index(drop=True) for i, g in df.groupby([(S - S[0]).astype(''timedelta64[h]'')])] print (L[0]) dt text 0 20160811 11:05 a 1 20160811 11:35 b 2 20160811 12:03 c print (L[1]) dt text 0 20160811 12:36 d 1 20160811 12:52 e print (L[2]) dt text 0 20160811 14:32 f

Solución antigua, que se divide por hour :

Puede usar groupby por dt.hour , pero primero necesita convertir dt to_datetime :

for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour]): print (g.reset_index(drop=True)) dt text 0 20160811 11:05 a 1 20160811 11:35 b dt text 0 20160811 12:03 c 1 20160811 12:36 d 2 20160811 12:52 e dt text 0 20160811 14:32 f

List comprehension solución de List comprehension :

L = [g.reset_index(drop=True) for i, g in df.groupby([pd.to_datetime(df.dt).dt.hour])] print (L[0]) dt text 0 20160811 11:05 a 1 20160811 11:35 b print (L[1]) dt text 0 20160811 12:03 c 1 20160811 12:36 d 2 20160811 12:52 e print (L[2]) dt text 0 20160811 14:32 f

O use la list comprehension con la conversión de la columna dt a datetime :

df.dt = pd.to_datetime(df.dt) L =[g.reset_index(drop=True) for i, g in df.groupby([df[''dt''].dt.hour])] print (L[1]) dt text 0 2016-08-11 12:03:00 c 1 2016-08-11 12:36:00 d 2 2016-08-11 12:52:00 e print (L[2]) dt text 0 2016-08-11 14:32:00 f

Si es necesario dividir por date s y hour s:

#changed dataframe for testing print (df) dt text 0 20160811 11:05 a 1 20160812 11:35 b 2 20160813 12:03 c 3 20160811 12:36 d 4 20160811 12:52 e 5 20160811 14:32 f serie = pd.to_datetime(df.dt) for i, g in df.groupby([serie.dt.date, serie.dt.hour]): print (g.reset_index(drop=True)) dt text 0 20160811 11:05 a dt text 0 20160811 12:36 d 1 20160811 12:52 e dt text 0 20160811 14:32 f dt text 0 20160812 11:35 b dt text 0 20160813 12:03 c


tomar la diferencia de fechas con la primera fecha y el grupo por total_segundos

df.groupby((df.dt - df.dt[0]).dt.total_seconds() // 3600, as_index=False).apply(pd.DataFrame.reset_index, drop=True)