2010-01-23 38 views
37

Estoy trabajando en un proyecto que permite a los usuarios rastrear diferentes tipos de datos a lo largo del tiempo. Parte de la idea base es que un usuario debe poder ingresar datos usando cualquier unidad que lo necesite. He estado buscando en ambas unidades:Conversión de unidades en Python

http://pypi.python.org/pypi/units/

y cantidades:

http://pypi.python.org/pypi/quantities/

Sin embargo no estoy seguro de que el mejor camino a seguir. Por lo que puedo decir, las cantidades son más complejas, pero incluyen una mejor lista inicial de unidades.

+3

Creo que necesita más información sobre su pregunta para recibir respuestas válidas. –

+0

Supongo que almacenará los datos normalizados en unidades SI, de modo que realmente se trata de un problema de análisis en la entrada y posiblemente un problema de conversión en la salida. Utilice la biblioteca que tenga el mejor análisis/conversión: puede usar diferentes en el modo de entrada y salida. –

+0

Desafortunadamente, hay muchas soluciones para esto en python. http://pint.readthedocs.org/en/latest/faq.html#you-mention-other-similar-python-libraries-can-you-point-me-to-those – endolith

Respuesta

1

Creo que deberías usar cantidades, porque una cantidad tiene algunas unidades asociadas.

La presión, por ejemplo, será una cantidad que podría introducirse y convertirse en diferentes unidades (Pa, psi, atm, etc.). Probablemente podrías crear nuevas cantidades específicas para tu aplicación.

24

Aplaudo el uso de unidades explícitas en aplicaciones informáticas científicas. Usar unidades explícitas es cepillarse los dientes de manera análoga. Añade algo de tedio por adelantado, pero el tipo de seguridad que obtienes puede ahorrarte muchos problemas a largo plazo. Como, digamos, not crashing $125 million orbiters into planets.

También debe, probablemente, prueba estos otros dos paquetes de unidad/cantidad de pitón:

Unum

Scientific.Physics.PhysicalQuantity

vez investigué Scientific.Physics.PhysicalQuantity. No satisfizo mis necesidades, pero podría satisfacer las tuyas. Es difícil saber qué características necesita de su breve descripción.

Terminé escribiendo mi propio paquete de python para la conversión de unidades y el análisis dimensional, pero aún no está debidamente empaquetado para la versión. Estamos utilizando mi sistema unitario en las vinculaciones de python para nuestro sistema OpenMM para la mecánica molecular acelerada de GPU. Puede navegar por el repositorio SVN de mi código unidades pitón en:

SimTK python units

Finalmente tengo la intención de empaquetarlo para su distribución. Si lo encuentras interesante, házmelo saber. Eso podría motivarme a empacarlo antes. Las características que estaba buscando cuando estaba diseñando el sistema de unidades Python SimTK incluyen lo siguiente:

  1. Las unidades NO se almacenan necesariamente en términos de unidades SI internamente. Esto es muy importante para mí, porque un área de aplicación importante para nosotros es a escala molecular. Usar unidades SI internamente puede conducir al desbordamiento del exponente en cálculos de fuerza molecular comúnmente usados. Internamente, todos los sistemas de la unidad son igualmente fundamentales en SimTK.
  2. Quería potencia y flexibilidad similares al sistema Boost.Units en C++. Tanto porque estoy familiarizado con ese sistema, y ​​porque fue diseñado bajo el escrutinio de un gran grupo de brillantes ingenieros. Boost.Units es un sistema de análisis dimensional de segunda generación bien diseñado. Por lo tanto, podría argumentar que el sistema de unidades SimTK es un sistema de tercera generación :). Tenga en cuenta que, si bien Boost.Units es un sistema de "cero gastos generales" sin costo de tiempo de ejecución, todas las implementaciones de cantidades python, incluidas las unidades SimTK, probablemente exigen un costo en tiempo de ejecución.
  3. Quiero cantidades dimensionadas que son compatibles con matrices numpy, pero no necesariamente requieren el paquete python numpy. En otras palabras, las cantidades pueden basarse en matrices numpy o en tipos de python incorporados.

¿Qué funciones son importantes para usted?

4

Parece que también ha salido otro paquete para hacer esto, escrito por Massimo DiPierro de web2py fame, llamado Buckingham.

También debe tenerse en cuenta que Brian ha tenido algo como esto por algún tiempo.

+0

Buckingham parece incompleto y no puede convertir de gramo a libras por ejemplo: '>>> (Número (100, dims = 'gramo')). convert ('libra'). valor ' resultados en 'RuntimeError: Dimensiones incompatibles' –

+1

Daniel, El error particular que menciona existe porque la definición interna de libra es como una unidad de fuerza en lugar de una masa. Además, ciertamente no tiene una lista exhaustiva de unidades compatibles. –

+0

Ahh que tendría sentido, para agregar soporte de masa de libra, agregue ''lb': (453.592,0,0,1,0,0,0), # lb' a la lista' UNITS'. –

6

Tenga en cuenta que quantities tiene muy mala apoyo a la temperatura:

>>> (100 * pq.degC).rescale(pq.degF) 
array(179.99999999999997) * degF 
>>> (0 * pq.degC).rescale(pq.degF) 
array(0.0) * degF 

0 grados centígrados no es 0 grados Fahrenheit. Su marco no admite ningún tipo de conversión que no solo se multiplique por un factor.

+0

La temperatura es complicada porque hay dos tipos: temperatura absoluta/termodinámica y diferencia relativa/temperatura. En absoluto, todos saben 0 ° F! = 0 ° C. Cuando se habla de una diferencia de temperatura (ΔT), 0 ° F == 0 ° C. –

15

Pint ha entrado recientemente en el campo. ¿A alguien le importa compartir sus experiencias? Se ve bien. FYI: Parece que Pint will be integrated with Uncertainties en el futuro cercano.

+3

¡La pinta es increíble! – canesin

+2

Estoy evaluando Pint al escribir esto, pero un gran * + 1 * es que es capaz de usar Decimal, lo que significa que no hay errores de redondeo de flotación funky - todas las mencionadas librerías mencionadas solo funcionan en tipo flotante - http: // python-in-the-lab.blogspot.ca/2013/01/how-many-pin-do-you-want-units-in.html –

+0

Ya no soy tan grande como +1 para Pint - en los últimos dos días he presentado hasta ahora dos correcciones de errores - I Estoy debatiendo si realmente necesito la funcionalidad/complejidad adicional y en su lugar podría usar algo sencillo como http://code.activestate.com/recipes/577652-unit-conversions-using-decimal/ –

3

Es posible que desee consultar un nuevo paquete llamado natu. Aborda los tres problemas enumerados por @ChristopherBruns. Está disponible en PyPI.

Soy el autor de ese paquete, y agradecería cualquier comentario o sugerencia.

2

Me sorprende que nadie haya mencionado SymPy todavía. SymPy es una biblioteca matemática matemática madura y bien mantenida para Python que además es un proyecto NumFOCUS-sponsored.

Tiene un módulo Physics con muchas clases útiles y funciones para "resolver problemas en física". Lo más relevante para usted es que tiene un submódulo Unit que contiene todo lo que necesita, creo; solo lea la excelente documentación.

Cuestiones relacionadas