14

キロからピコ、ナノからギガなど、さまざまな SI プレフィックス間の数値の変換をサポートする Python ライブラリを探しています。どのようなものをお勧めしますか?

4

6 に答える 6

6

辞書

以下に示すようなサードパーティのライブラリを使用したくない場合は、実際に独自の解析関数を実装できます。

辞書を使用して、プレフィックスをそれらの値に一致させます。私はすでにあなたのためにそれをしました:

_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
    }

次に、正規表現を使用して(ここでの私の回答で説明されているように)、入力を検索または解析し、辞書を使用して適切な値を取得できます。


Unum

Unumは完成度が高く、完全に文書化されたライブラリです。

長所:

  • 任意の単位を定義できます(基本単位の組み合わせである限り、マグニチュードはユーザー定義の単位のみをサポートします)。

短所:

  • プレフィックスをうまく処理しません
  • 名前空間がすべてのユニット定義で乱雑になります(名前空間にMSなどの名前の変数が含まれることになります)

マグニチュード

別のライブラリであるMagnitudeを使用することもできます。それはあなたが話しているすべての種類のSI単位接頭辞をサポートし、さらに解析も処理します。サイトから:

物理量は、10 km/hのような単位での数値です。単位は文字列として指定されます。それらは、SI単位のいずれかに加えて、非SIの束、ビット、ドル、およびそれらの任意の組み合わせにすることができます。標準のSIプレフィックスを含めることができます。
...
yoctoからyottaまで、およびkibiからexbiまで、すべての標準プレフィックスが理解されます。

于 2012-06-10T17:45:52.567 に答える
4

これが最良の答えかどうかはわかりませんが、私の場合は機能しています。私のソリューションを自由に確認してください。私はPythonで初めて働いています.建設的な批判は大歓迎です...肯定的なフィードバックとともに:D
これは私のコードです:

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' : 'da'},
           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, ''];


そして、これがどのように機能するかです:

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);

そして、応答は次のとおりです。

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

誰かがこれが役立つかどうかはわかりません。お願いします。私はここに投稿したので、それを見て助けを求めている人々は、おそらくそれを最適化できるかもしれません:)

于 2013-12-06T15:24:41.857 に答える
3

これが古いスレッドであることは知っていますが、あらゆる種類のプレフィックス単位変換処理を処理する、私が作成した Python ライブラリへの参照を捨てたいと思います。

主な機能のリストは次のとおりです。

  • SINISTのプレフィックス単位間の変換( kBGiB)
  • 同じタイプの単位間の変換 (SI から SI、または NIST から NIST)
  • 人間が判読できる自動プレフィックス選択 (hurry.filesize https://pypi.python.org/pypi/hurry.filesizeなど)
  • 基本的な算術演算 (50GiB から 42KiB を引く)
  • 豊富な比較操作 ( 1024 Bytes == 1KiB)
  • ビット演算 ( <<, >>, &, |, ^)
  • デバイスのストレージ容量の読み取り (Linux/OS X サポートのみ)
  • argparse https://docs.python.org/2/library/argparse.html カスタム型としての統合
  • プログレスバー https://code.google.com/p/python-progressbar/ より良いファイル転送速度ウィジェットとして統合
  • 文字列の解析
  • 並べ替え
于 2016-01-07T16:32:56.760 に答える