Conversión de unidades con Python 3

Librería pint

Hay varias bibliotecas de Python que incorporan unidades en los cálculos de Python. Entre estos, pint es una biblioteca relativamente nueva que se basa en la experiencia con intentos anteriores.
Pint es un paquete de Python para definir, operar y manipular cantidades físicas: el producto de un valor numérico y una unidad de medida. Permite operaciones aritméticas entre ellos y conversiones desde y hacia diferentes unidades.


Para comenzar debemos instalar la librería en nuestro interprete de python, en este caso Anaconda, para esto debemos escribir lo siguiente en nuestra terminal (como se muestra en la imagen) y posteriormente presionar ENTER, si utilizas windows debes buscar Anaconda Prompt (debe iniciar con permisos de administrador).
  1. pip install pint
El concepto central en pint es trabajar con un registro de las unidades, que se crea de la siguiente manera
  1. from pint import UnitRegistry
  2. ur = UnitRegistry()

Operaciones con unidades multiplicativas

El registro de unidades proporciona un medio simple para asignar unidades utilizando el operador de multiplicación. Por ejemplo, aquí se explica cómo calcular la molaridad de una solución de cloruro de sodio en 58.44 gramos de NaCl (mw = 58.44) se ha disuelto en agua para formar 3 litros de solución.
El código para este ejemplo seria el siguiente:
  1. from pint import UnitRegistry
  2. ur = UnitRegistry()
  3. # datos del problema
  4. V = 3.0 * ur.liters
  5. m = 58.44 * ur.grams
  6. mw = 58.44 * ur.grams/ur.mol
  7. # calcular molaridad
  8. C = m/(mw*V)
  9. print(C)
Como resultado nos muestra lo siguiente
0.3333333333333333 mole / liter

Conversión de unidades

Cada variable con unidades tiene disponibles los métodos to() e ito() para convertir la cantidad a un conjunto de unidades deseado. El método to() se usa para crear una nueva variable al convertir una variable existente a las unidades indicadas. Por ejemplo:
  1. x = 0.5 * ur.kilogram/ur.gallon
  2. y = x.to(ur.gram/ur.liter)
  3. print(x)
  4. print(y)
NOTA: Recuerde que siempre debe importar primero la librería y crear el registro. Lo omito para ahorrar espacio. Ademas, la librería se encuentra en ingles, siempre deberá escribir en ingles el nombre de las unidades.
El resultado es el siguiente:
0.5 kilogram / gallon
132.08602617907428 gram / liter
Por otro lado, el método ito() convierte una variable existente "en el lugar". Modificando el ejemplo anterior obtenemos lo siguiente:
  1. x = 0.5 * ur.kilograms/ur.gallon
  2. x.ito(ur.grams/ur.liter)
  3. print(x)
132.08602617907428 gram / liter
Notamos que el método to() nos da la opción de crear una nueva variable o heredarlo sobre la misma, a diferencia el método ito() el cual únicamente hereda el valor en la misma variable.
Para ejemplificar el uso de ambos métodos, en el siguiente código se ilustra cómo calcular la molaridad de una solución de cloruro de sodio en la que se han disuelto 0.5 libras de NaCl (mw = 58.44) en agua para formar 2 galones de solución.
  1. # Datos del problema
  2. V = 3.0 * ur.gallons
  3. m = 0.5 * ur.lbs
  4. mw = 58.44 * ur.grams/ur.mol
  5. # calculamos la concentration
  6. C = m/(mw*V)
  7. print(C)
  8. # convertir a las unidades deseadas e imprimir
  9. C = C.to(ur.mol/ur.liter)
  10. print(C)
  11. # convertir a moles por gallon
  12. C.ito(ur.mol/ur.gallon)
  13. print(C)
Como resultado de ejecutar el código anterior obtenemos lo siguiente:
  1. 0.0028519279032626055 mole * pound / gallon / gram
  2. 0.34173633161332617 mole / liter
  3. 1.293612736710016 mole / gallon
Si quieres saber como llamar mas unidades puedes revisar el siguiente enlace. Te dirigirá a la lista de unidades disponibles y a la documentación oficial de la librería.

Unidades de temperatura y otras unidades de compensación (no multiplicativas)

Algunos ejemplos de unidades no multiplicativas son grados Celsius, grados Fahrenheit y presión manométrica. Para estas unidades, el cero de la escala de medición se compensa con respecto al cero absoluto de la cantidad física subyacente. En estos casos, las unidades se asignan utilizando la función Quantity() del módulo UnitRegistry. Para ejemplificar el uso escribimos el siguiente codigo:
  1. >>> T = ur.Quantity(25,ur.degC)
  2. >>> print(T, " = ", T.to(ur.degF))
  3. 25 degree_Celsius  =  76.99999999999993 degree_Fahrenheit

Ejemplos

Problema 1
La viscosidad de una sustancia es de 10 centipoises. ¿Cuál es el valor de esa viscosidad en $Ib/pie \cdot s$ ? Nota: 1 centipoise = 0.01 poise =  0.01 g/cm s
Este ejercicio se resolvió en una entrada anterior, por lo tanto ya conocemos los resultados. Un ejemplo de código para resolver este problema seria el siguiente:
  1. from pint import UnitRegistry
  2. ur = UnitRegistry()
  3. # datos del problema
  4. v=10 *ur.centipoise
  5. print(v)
  6. v=v.to(ur.poise)
  7. print(v)
  8. v.ito(ur.pound/(ur.foot*ur.second))
  9. print(v)
El resultado tras ejecutar el código es el siguiente:
10 centipoise
0.1 poise
0.006719689751395069 pound / foot / second
Los resultados coinciden.

Problema 2
La conductividad térmica del aluminio es de 120 BTU/h ft °F. Calcule su conductividad en kcal/h m°C y en W/m °K.
De igual manera, este ejercicio ya fue resuelto manualmente en la entrada anterior, pero este problema no podemos resolverlo de manera "directa", ya que dentro de la librería no hay el cambio entre tamaños de grado, pero podemos agregar este en una linea adicional de la siguiente manera. No olvide que al final debería ubicar el °F en el divisor. El ejemplo de código seria el siguiente:
  1. from pint import UnitRegistry
  2. ur = UnitRegistry()
  3. # datos del problema
  4. k=120*ur.Btu/(ur.hour*ur.foot)
  5. print(k,'/°F')
  6. k=120*1.8*ur.Btu/(ur.hour*ur.foot)
  7. k=k.to(ur.kcal/(ur.hour*ur.meter))
  8. print(k,'/°C')
  9. k.ito(ur.watt/ur.meter)
  10. print(k,'/°K')
Y el resultado de la ejecución es el siguiente:
120.0 british_thermal_unit / foot / hour /°F
178.6992065762334 kilocalorie / hour / meter /°C
207.68818897637794 watt / meter /°K
De esta forma podemos resolver este tipo de problemas, pero hay que ser muy cuidadoso para no cometer un calculo incorrecto.

Referencias

Comentarios

Publicar un comentario