我正在尋找一個支持將各種SI前綴之間的數字進行轉換的python庫,例如,kilo to pico,nano to giga等。您會推薦什麼?在SI單元前綴之間進行轉換的Python庫
回答
字典
如果你不希望使用任何第三方庫像下面列出的,實際上你可以實現你自己的分析功能。
使用字典將前綴與它們的值進行匹配。我已經做到了你已經:
_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
}
然後你可以使用正則表達式(如my answer here描述)來搜索或解析輸入,並使用字典獲取適當的值。
UNUM
Unum是很好完成,全面記錄庫。
優點:
- 允許定義任意單位(大小僅支持用戶定義的單元,只要它們是基本單元的組合)。
缺點:
- 沒有處理好前綴
- 雜波與所有單位定義命名空間(你結束了在你的命名空間命名爲
M
,S
等變量)
大小
您還可以使用Magnitude,另一個庫。它支持你正在談論的所有SI單位前綴,並且它還會處理解析。來自網站:
物理量是一個單位的數字,如10公里/小時。單位被指定爲字符串。它們可以是任何SI單位,加上一堆非SI,比特,美元和它們的任意組合。 它們可以包含標準的SI前綴。
...
從yocto到yotta和從kibi到exbi,所有標準前綴都被理解。
正則表達式聽起來不像是檢測使用哪個前綴的最佳方式。不記錄(絕對值(值))可以在可用於選擇前綴的表單中爲您提供值的大小。 –
我不知道這是不是最好的答案,但它是工作在我的情況。隨時驗證我的解決方案。我第一次和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' : '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, ''];
,這是它如何工作的:
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']
我不知道是否有人會發現這有幫助或n OT。我希望你會。我已經在這裏發佈,所以需要幫助的人也可以給他們一個想法,也許他們可以優化它:)
我將一個簡單函數(original C version written by Jukka 「Yucca」 Korpela)移植到Python中,用於根據SI標準對數字進行格式化。我用它的時候,例如,對情節設置刻度標記等
你可以安裝它:
pip install si-prefix
源可on GitHub。
用法示例:
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
你是一位金神 – Peter
我知道這是一個古老的線程,但我只是想拋出一個Python庫我寫了一個參考它處理處理
前綴單位轉換的所有方式ħ ERE的主要功能列表:
- 轉換SI和NIST之間前綴單位(
kB
到GiB
) - 同類型單位之間的轉換(SI到SI,或與NIST NIST)
- 自動可讀的前綴選擇(如匆忙。文件大小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/ 整合爲一個更好的文件傳輸速度部件
- 字符串分析
- 排序
QuantiPhy是一個新包,轉換和從與SI比例因子的數字。 Unum和Magnitude這類單位包比單位重,而不是比例因子,這通常是更好的選擇。
QuantiPhy提供數量,它是一個將數字與其度量單位相結合的對象(單位是可選的)。創建數量時,可以使用SI單位前綴。一旦你有一個數量,你可以在表達式中使用它,作爲一個浮點。或者您可以將其轉換爲字符串,在這種情況下,它默認使用SI單位前綴。
>>> 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
默認情況下QuantiPhy渲染爲一個字符串,這可能是你想要什麼,當採用天然前綴。但是你可以強制其渲染爲一個特定的前綴使用比例:
>>> 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
在這種情況下,你必須關閉SI單位前綴,以避免越來越多的前綴:「1個NPG」。
一個更自然的例子可能是你在哪裏轉換單元:
>>> l = Quantity('2um')
>>> print(l.render(scale='Å'))
20 kÅ
>>> print(f'{l:sÅ}')
20 kÅ
最後一個例子表明,你可以把你想要的單位在格式字符串類型後,轉換會爲你自動完成。
- 1. 在SQL中處理SI前綴
- 2. CLISP中綴,後綴,前綴(我想如果語句)之間的轉換
- 3. ggplot2軸標籤中的SI前綴
- 4. Linux錯誤 - 排序:出現在單元上的SI和IEC前綴
- 5. 在活動之間進行轉換
- 6. 在System.Data.SqlDbType和Microsoft.SqlServer.Management.Smo.SqlDataType之間進行轉換
- 7. 在插入數據庫之前進行類型轉換?
- 8. 將中綴轉換爲python中的前綴
- 9. 使用Python對前綴進行迭代
- 10. 如何將前綴轉換爲中綴
- 11. C++中綴到前綴轉換?
- 12. 中綴到前綴轉換方案
- 13. 將前綴轉換爲後
- 14. D3單元格式化SI進行舍入(nvd3圖表)
- 15. CSS在僞元素太大之前進行文本換行
- 16. 如何在前綴(關鍵幀)中添加前綴(轉換)?
- 17. 在Python中的菜單之間交換
- 18. 註冊前綴在連字符之間
- 19. 在單擊的元素之間切換
- 20. 如何在Python 3中的字節和字符串之間進行轉換?
- 21. Python - 刪除行之前的換行符?
- 22. 在Spring MVC3.0中重定向:前綴和前向:前綴之間的區別
- 23. SQL:如何將值行轉換爲變量,前綴和後綴
- 24. 任何可用於在浮點表示之間進行轉換的C++庫?
- 25. 日期時間輸入時區之間進行轉換的PHP
- 26. 在Python中的列表和字典之間進行切換?
- 27. 標準java庫來驗證和轉換中綴爲前綴/後綴表示法?
- 28. 在C++中的基數之間進行轉換
- 29. 如何在SKScene中的幾個ViewController之間進行轉換?
- 30. 如何在C++中的不同類之間進行轉換?
[Python中的單位轉換]可能的重複(http://stackoverflow.com/questions/2125076/unit-conversion-in-python) – GWW
@GWW:不是真的,那個問題想要轉換單位,這是關於前綴。 – Junuxx
@Zed:這是不是很清楚你想要做什麼。例如,輸入的格式是什麼?字符串?數字和字符串?數字和前綴索引?如果你舉了一個你想要做什麼的例子,這可能會有所幫助。 – Junuxx