En los anteriores capítulos vimos como crear una estructura básica para nuestro fichero h5
y como rellenar una tabla de datos. Ahora vamos a ver como volver a la tabla que ya rellenamos para añadir nuevos registros sin eliminar los anteriores.
Modificar tablas existentes
Podemos añadir datos a tablas existentes de la siguiente forma. Para hacerlo primero abrimos el fichero que ya creamos anteriormente en modo “append”, obtenemos el nodo que nos lleva a la tabla en cuestión que queremos rellenar (tab
será una instancia de la clase Table
) y establecemos un ‘puntero’ donde guardar los nuevos datos (con ayuda de tab.row
donde mis_datos
serán una instancia de la clase Row
):
# Si no habéis importado las librerías necesarias # descomentad las siguientes tres líneas: # import numpy as np # import datetime as dt # import tables as tb h5file = tb.open_file("tabla_test.h5", mode = "a") tab = h5file.get_node("/carpeta1/datos_carpeta1_tabla1") mis_datos = tab.row
Ahora vamos a recuperar la última fecha que habíamos introducido en la columna fechas para seguir metiendo registros con fechas a continuación.
# En la siguiente línea recuperamos el último elemento # de la columna fecha # No os preocupéis por esto ahora, lo veremos más adelante ult_fecha = str(tab.cols.fecha[-1]) yy = int(ult_fecha[:4]) mm = int(ult_fecha[4:6]) dd = int(ult_fecha[6:]) f0 = dt.date(yy, mm, dd) + dt.timedelta(days=1) # Creamos 2000 nuevas fechas a continuación de la última que # habíamos introducido con sus valores x, y, z correspondientes fechas = np.array( [int((f0 + dt.timedelta(days=1) * i).strftime("%Y%m%d")) for i in range(2000)], dtype = np.int32 ) x = np.random.randn(2000) y = np.random.randn(2000) z = np.random.randn(2000)
Y, finalmente, añadimos los nuevos valores tal como vimos en el anterior capítulo:
for i in range(2000): mis_datos['fecha'] = fechas[i] mis_datos['x'] = x[i] mis_datos['y'] = y[i] mis_datos['z'] = z[i] mis_datos.append() tab.flush()
En la siguiente imagen se muestra un ejemplo de lo que acabamos de hacer:
¿Qué pasa si ahora queremos modificar un valor de una columna? Eso lo podemos hacer usando la clase `Cols`. Imaginad que los primeros diez elementos de la columna `x` son erróneos y los queremos representar con ‘NaNs’. Lo podemos hacer así:
tab.cols.x[0:10] = np.repeat(np.NAN, 10) tab.flush()
Si ahora inspeccionamos la tabla veremos que los diez primeros elementos de la columna ‘x’ han cambiado al valor NaN:
¿Y si queremos cambiar una columna entera de datos? Pues siguiendo el mismo procedimiento podemos hacer lo siguiente para modificar la columna ‘z’:
tab.cols.z[:] = np.repeat(-999.99, tab.cols.z.shape[0]) tab.flush()
Con lo que la tabla quedaría con la última columna (columna ‘z’) con todos sus elementos con valor ‘-999.99’
Finalmente, para terminar este capítulo, cerramos la tabla creada como vimos en anteiores capítulos.
h5file.close()
Veremos un poco más en los próximos días, estad atentos.
Saludos.
Muy bueno gracias Kiko! realmente muy intuitivo y muy pythonico para usar, definitivamente la siguiente serie de datos que deba procesar la almacenaré en hdf5, por suerte pandas también puede trabajar con pytables!
Reblogueó esto en El Blog de FoxCarlos.