将带有单位的数字转换为非人类可读格式

Posted

技术标签:

【中文标题】将带有单位的数字转换为非人类可读格式【英文标题】:Convert number with units in python to NON human readable format 【发布时间】:2016-01-26 15:44:42 【问题描述】:

转换包含浮点数和单位的数字列的最佳方法是:

df = pd.DataFrame(["211.301 MB","435.5 GB","345.234 Bytes"])

例如以字节为单位的预期输出:

211.301*1024*1024 = 221565157.376

很多这样的问题: Reusable library to get human readable version of file size?

正在展示相反的方法:将数字转换为人类可读的。如何将人类可读转换为浮动?

有没有比拆分更有效的方法:

spl = pd.DataFrame(dataf['Total_Image_File_Size'].str.split(' ',expand=True))

然后用 if 的倍数解析单位列?

感谢

【问题讨论】:

只是创建一个字典,将字母映射到指数? 'K': 2**10, 'M': 2**20, ... 【参考方案1】:

我认为这个应该可以:https://pypi.python.org/pypi/humanfriendly

>>> import humanfriendly
>>> user_input = raw_input("Enter a readable file size: ")
Enter a readable file size: 16G
>>> num_bytes = humanfriendly.parse_size(user_input)
>>> print num_bytes
17179869184
>>> print "You entered:", humanfriendly.format_size(num_bytes)
You entered: 16 GB

【讨论】:

哇,我错过了这个。这太棒了!【参考方案2】:

您可以创建函数将文本转换为值并使用apply

import pandas as pd

df = pd.DataFrame(["211.301 MB","435.5 GB","345.234 Bytes"])


def convert(text):

    parts = text.split(' ')

    value = float(parts[0])

    if parts[1] == 'KB':
        value *= 1024
    elif parts[1] == 'MB':
        value *= 1024 * 1024
    elif parts[1] == 'GB':
        value *= 1024 * 1024

    return value



df['value'] = df[0].apply(convert)


           0         value  
0     211.301 MB  2.215652e+08  
1       435.5 GB  4.566548e+08  
2  345.234 Bytes  3.452340e+02

编辑:你可以在这个函数中使用humanfriendly而不是if/elif

【讨论】:

【参考方案3】:

只是另一个想法。

>>> for size in "211.301 MB", "435.5 GB", "345.234 Bytes":
        number, unit = size.split()
        print float(number) * 1024**'BKMGT'.index(unit[0])

221565157.376
4.67614564352e+11
345.234

【讨论】:

以上是关于将带有单位的数字转换为非人类可读格式的主要内容,如果未能解决你的问题,请参考以下文章

将以秒为单位的时间间隔转换为更易读的形式

将日期从人类可读格式转换为纪元失败

如何在 Swift 中将多字符数字格式转换为可读的字符串?

将人类可读的文件大小转换为 ruby​​ 中的字节

C#如何将带有感叹号图标注释的文本格式的数字转换为数字格式的数字?

将 Epoch 时间戳转换为 sql server(人类可读格式)