Python如何将浮点数作为十六进制转换为十进制

Posted

技术标签:

【中文标题】Python如何将浮点数作为十六进制转换为十进制【英文标题】:Python How to convert a float as hex to decimal 【发布时间】:2017-04-21 13:07:07 【问题描述】:

我已经从带有 pandas 的 csv 文件中读取了一些数据。数据不完整,因此包含许多 nan 值。 我想在将十六进制值转换为十进制值的数据中添加一列。不幸的是,具有十六进制值的列都被读取为浮点数,而不是字符串,因为它们恰好具有这些值。 示例数据

   val
0 20.0
1  nan
2 20.0

在python中将十六进制转换为十进制的简单方法似乎是:int('20.0',16),它应该产生32

但是,由于这是 pandas,我无法将值转换为 int,或者至少我不断收到错误说明。 我当前的代码是:

df['valdec'] = np.where(np.isnan(df['val']), 
                    df['val'], 
                    int(df['val'].astype(int).astype(str), 16))

这失败并出现错误:

ValueError: 无法将 NA 转换为整数

如果没有astype(int),则值为"20.0",无法转换。 使用 pandas 数据帧时,是否有另一种方法可以将浮点值解释为十六进制值并转换为十进制?

【问题讨论】:

如果我的回答解决了您的问题,那么您可以接受,我的回答左上角会有一个空的勾号,如果您需要进一步的内容,那么您需要评论并添加更多信息 【参考方案1】:

您可以屏蔽感兴趣的行并进行双重转换并致电apply

In [126]:
df['valdec'] = df['val'].dropna().astype(int).astype(str).apply(lambda x: int(x, 16))
df

Out[126]:
    val  valdec
0  20.0    32.0
1   NaN     NaN
2  20.0    32.0

所以首先我们调用dropna 来删除NaN,这允许我们使用.astype(int) 转换为int,然后通过调用.astype(str) 转换为str

然后我们在此调用apply 以转换为十六进制并将所有这些的结果分配给新列

请注意,新列的dtype 将为float,因为NaN 的存在会强制执行此操作,您将无法混合使用ints 和floats

正如@jasonharper 所指出的,在此处转换为int 将丢失任何小数 部分所以更高精度的方法是使用float.fromhex:

In [128]:
df['valdec'] = df['val'].astype(str).dropna().apply(lambda x: float.fromhex(x))
df

Out[128]:
    val  valdec
0  20.0    32.0
1   NaN     NaN
2  20.0    32.0

【讨论】:

通过int 进行的转换当然会丢失数字的任何小数部分。十六进制浮点字符串的正确转换是float.fromhex(s) @jasonharper 已添加您的建议 太棒了!非常感谢你。我找到了 dropna,但忘记了 python 如何处理丢弃的值。很好的解决方案!

以上是关于Python如何将浮点数作为十六进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数转换为十进制,错误的值

将浮点数与整数及其二进制表示进行比较

C将浮点数转换为int

如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串

C++ 将浮点数保存并加载到二进制文件中,由指针寻址

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?