Biblioteca de Python para convertir entre prefijos de unidad SI

Estoy buscando una biblioteca de python que viene con soporte para convertir números entre varios prefijos de SI, por ejemplo, kilo a pico, nano a giga y así sucesivamente. ¿Qué recomendaría?

Puse una función simple (versión C original escrita por Jukka “Yucca” Korpela) a Python para formatear los números de acuerdo con los estándares SI. Lo uso a menudo, por ejemplo, para establecer tags de tick en gráficos, etc.

Puedes instalarlo con:

 pip install si-prefix 

La fuente está disponible en GitHub .

Ejemplo de uso:

 from si_prefix import si_format print si_format(.5) # 500.0m (default precision is 1) print si_format(.01331, precision=2) # 13.31m print si_format(1331, precision=2) # 1.33k print si_format(1331, precision=0) # 1k 

Los diccionarios

Si no desea utilizar ninguna biblioteca de terceros como las que se enumeran a continuación, puede implementar su propia función de análisis.

Use un diccionario para hacer coincidir los prefijos con sus valores. Ya lo he hecho por ti:

 _prefix = {'y': 1e-24, # yocto 'z': 1e-21, # zepto 'a': 1e-18, # atto 'f': 1e-15, # femto 'p': 1e-12, # pico 'n': 1e-9, # nano 'u': 1e-6, # micro 'm': 1e-3, # mili 'c': 1e-2, # centi 'd': 1e-1, # deci 'k': 1e3, # kilo 'M': 1e6, # mega 'G': 1e9, # giga 'T': 1e12, # tera 'P': 1e15, # peta 'E': 1e18, # exa 'Z': 1e21, # zetta 'Y': 1e24, # yotta } 

Luego puede usar expresiones regulares (como se describe en mi respuesta aquí ) para buscar o analizar la entrada y usar el diccionario para obtener el valor apropiado.


Unum

Unum está bien terminada y bien documentada biblioteca.

Pros:

  • le permite definir unidades arbitrarias (la magnitud solo admite unidades definidas por el usuario siempre que sean una combinación de las unidades base).

Contras:

  • no maneja bien los prefijos
  • desordena tu espacio de nombres con todas sus definiciones de unidades (terminas con variables llamadas M , S , etc. en tu espacio de nombres)

Magnitud

También puedes usar Magnitude , otra biblioteca. Admite todos los tipos de prefijos de unidad SI de los que está hablando, además de que también manejará el análisis. Desde el sitio:

Una cantidad física es un número con una unidad, como 10 km / h. Las unidades se especifican como cadenas. Pueden ser cualquiera de las unidades del SI, más un grupo de no-SI, bits, dólares y cualquier combinación de ellos. Pueden incluir los prefijos SI estándar.

Se entienden todos los prefijos estándar, de yocto a yotta y de kibi a exbi.

No sé si esta es la mejor respuesta pero está funcionando en mi caso. Siéntase libre de verificar mi solución. Estoy trabajando por primera vez con Python y la crítica constructiva es bienvenida … junto con comentarios positivos: D
Este es mi código:

 class Units: def __init__(self): global si; si = { -18 : {'multiplier' : 10 ** 18, 'prefix' : 'a'}, -17 : {'multiplier' : 10 ** 18, 'prefix' : 'a'}, -16 : {'multiplier' : 10 ** 18, 'prefix' : 'a'}, -15 : {'multiplier' : 10 ** 15, 'prefix' : 'f'}, -14 : {'multiplier' : 10 ** 15, 'prefix' : 'f'}, -13 : {'multiplier' : 10 ** 15, 'prefix' : 'f'}, -12 : {'multiplier' : 10 ** 12, 'prefix' : 'p'}, -11 : {'multiplier' : 10 ** 12, 'prefix' : 'p'}, -10 : {'multiplier' : 10 ** 12, 'prefix' : 'p'}, -9 : {'multiplier' : 10 ** 9, 'prefix' : 'n'}, -8 : {'multiplier' : 10 ** 9, 'prefix' : 'n'}, -7 : {'multiplier' : 10 ** 9, 'prefix' : 'n'}, -6 : {'multiplier' : 10 ** 6, 'prefix' : 'u'}, -5 : {'multiplier' : 10 ** 6, 'prefix' : 'u'}, -4 : {'multiplier' : 10 ** 6, 'prefix' : 'u'}, -3 : {'multiplier' : 10 ** 3, 'prefix' : 'm'}, -2 : {'multiplier' : 10 ** 2, 'prefix' : 'c'}, -1 : {'multiplier' : 10 ** 1, 'prefix' : 'd'}, 0 : {'multiplier' : 1, 'prefix' : ''}, 1 : {'multiplier' : 10 ** 1, 'prefix' : 'd'}, 2 : {'multiplier' : 10 ** 3, 'prefix' : 'k'}, 3 : {'multiplier' : 10 ** 3, 'prefix' : 'k'}, 4 : {'multiplier' : 10 ** 3, 'prefix' : 'k'}, 5 : {'multiplier' : 10 ** 3, 'prefix' : 'k'}, 6 : {'multiplier' : 10 ** 6, 'prefix' : 'M'}, 7 : {'multiplier' : 10 ** 6, 'prefix' : 'M'}, 8 : {'multiplier' : 10 ** 6, 'prefix' : 'M'}, 9 : {'multiplier' : 10 ** 9, 'prefix' : 'G'}, 10 : {'multiplier' : 10 ** 9, 'prefix' : 'G'}, 11 : {'multiplier' : 10 ** 9, 'prefix' : 'G'}, 12 : {'multiplier' : 10 ** 12, 'prefix' : 'T'}, 13 : {'multiplier' : 10 ** 12, 'prefix' : 'T'}, 14 : {'multiplier' : 10 ** 12, 'prefix' : 'T'}, 15 : {'multiplier' : 10 ** 15, 'prefix' : 'P'}, 16 : {'multiplier' : 10 ** 15, 'prefix' : 'P'}, 17 : {'multiplier' : 10 ** 15, 'prefix' : 'P'}, 18 : {'multiplier' : 10 ** 18, 'prefix' : 'E'}, } def convert(self, number): # Checking if its negative or positive if number < 0: negative = True; else: negative = False; # if its negative converting to positive (math.log()....) if negative: number = number - (number*2); # Taking the exponent exponent = int(math.log10(number)); # Checking if it was negative converting it back to negative if negative: number = number - (number*2); # If the exponent is smaler than 0 dividing the exponent with -1 if exponent < 0: exponent = exponent-1; return [number * si[exponent]['multiplier'], si[exponent]['prefix']]; # If the exponent bigger than 0 just return it elif exponent > 0: return [number / si[exponent]['multiplier'], si[exponent]['prefix']]; # If the exponent is 0 than return only the value elif exponent == 0: return [number, '']; 

Y así es como funciona:

 c1 = +1.189404E-010 fres = -4.07237500000000E+007; ls = +1.943596E-005; units = sci.Units(); rValue, rPrefix = units.convert(c1); print rValue; print rPrefix; print units.convert(fres); print units.convert(ls); 

Y la respuesta es:

 118.9404 p [-40.72375, 'M'] [19.435959999999998, 'u'] 

No sé si alguien encontrará esto útil o no. Espero que lo hagas. He publicado aquí para que las personas que quieran ayuda lo vean también para darles una idea, tal vez puedan optimizarlo 🙂

Sé que este es un hilo antiguo, pero me gustaría lanzar una referencia a una biblioteca de Python que escribí que maneja todo tipo de manejo de conversión de unidades de prefijo

  • Bitmath – Docs
  • Bitmath – GitHub

Aquí está la lista de características principales:

  • Conversión entre unidades de prefijo SI y NIST ( kB a GiB )
  • Conversión entre unidades del mismo tipo (SI a SI o NIST a NIST)
  • Selección automática de prefijos legibles por el hombre (como en hurry.filesize https://pypi.python.org/pypi/hurry.filesize )
  • Operaciones aritméticas básicas (restando 42KiB de 50GiB)
  • Operaciones de comparación enriquecidas ( 1024 Bytes == 1KiB )
  • operaciones bitwise ( << , >> , & , | , ^ )
  • Lectura de la capacidad de almacenamiento de un dispositivo (solo para Linux / OS X)
  • argparse https://docs.python.org/2/library/argparse.html integración como un tipo personalizado
  • progressbar https://code.google.com/p/python-progressbar/ integración como un mejor widget de velocidad de transferencia de archivos
  • Análisis de cuerdas
  • Clasificación

QuantiPhy es un nuevo paquete que se convierte ay desde números con factores de escala SI. A menudo es una mejor opción que los paquetes de unidades, como Unum y Magnitud, que son más pesados ​​y se centran en las unidades en lugar de los factores de escala.

QuantiPhy proporciona Cantidad, que es un objeto que combina un número con su unidad de medida (las unidades son opcionales). Al crear una cantidad puede usar prefijos de unidades SI. Una vez que tienes una Cantidad, puedes usarla en expresiones, donde actúa como un flotador. O puede convertirlo en una cadena, en cuyo caso utiliza los prefijos de la unidad SI de forma predeterminada.

 >>> from quantiphy import Quantity # convert strings to quantities >>> duration = Quantity('0.12 ks') >>> print(duration) 120 s # convert to other units when rendering to a string >>> print(duration.render(scale='min')) 2 min # quantities act like floats in expressions >>> rate = 1/duration >>> print(rate) 0.008333333333333333 # convert floats to quantities >>> rate = Quantity(rate, 'Hz') >>> print(rate) 8.3333 mHz # can be used in format strings >>> print(f'Duration = {duration:<12.3} Rate = {rate}') Duration = 120 s Rate = 8.3333 mHz 

Por defecto, QuantiPhy usa el prefijo natural cuando se procesa en una cadena, que es probablemente lo que desea. Pero puede forzarlo para que se renderice a un prefijo específico usando la escala:

 >>> mass = Quantity('1000 g') >>> print(mass) 1 kg >>> print(mass.render(show_si=False)) 1e3 g >>> print(mass.render(show_si=False, scale=(1e-12, 'pg'))) 1e9 pg 

En este caso, debe desactivar los prefijos de la unidad SI para evitar obtener múltiples prefijos: '1 npg'.

Un ejemplo más natural podría ser cuando estás convirtiendo unidades:

 >>> l = Quantity('2um') >>> print(l.render(scale='Å')) 20 kÅ >>> print(f'{l:sÅ}') 20 kÅ 

El último ejemplo muestra que puede colocar sus unidades deseadas en la cadena de formato después del tipo y la conversión se realizará automáticamente.