Aprende (funcionalidad básica de) PyTables paso a paso (III)

Por Kiko Correoso

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.openFile("tabla_test.h5", mode = "a")
tab = h5file.getNode("/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:])
fecha0 = 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((fecha0 +
                  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 anteriores capítulos.

h5file.close()

Veremos un poco más en los próximos días, estad atentos.

Saludos.


photo

Kiko es doctor en ciencias físicas y esta especializado en física de la atmósfera, meteorología y climatología. Además de estar en las nubes es especialista en temas de energías renovables en Iberdrola. Ávido de seguir mejorando siempre está abierto a participar en nuevos proyectos y retos por lo que no dudes en contactarle si necesitas servicios especializados de Python o meteorología.

Comentarios