python - float 到 uint16 的转换会导致 numpy 中的数字增加吗?

标签 python numpy pandas casting type-conversion

我的数据有从 1947 年到 2012 年的每日 indate 和从 1997 年到 2012 年的 outdate。我不明白下面的行如何导致 Monthstoadd = 62844 (这会增加一些时间偏移量)。可以转换为uint16以便在循环中使用吗?为什么?我们可以做什么?

以下行适用于 INDATUMAUTDATUMA 格式为 20071231 的数据,例如日期解析似乎适用于 indateoutdate,这些值是有意义的。 (我展示的代码比严格必要的要多,因为我对什么应该起作用的假设在某些地方显然是错误的,所以也许我在什么方面是错误的。数据结构来自 pandas。)

all_treatments['indate'] = pd.to_datetime(all_treatments['INDATUMA'], errors='coerce',format='%Y%m%d')
all_treatments['outdate'] = pd.to_datetime(all_treatments['UTDATUMA'], errors='coerce',format='%Y%m%d')
all_treatments['extramonths'] = 12*(all_treatments['outdate'].dt.year-all_treatments['indate'].dt.year)+(all_treatments['outdate'].dt.month-all_treatments['indate'].dt.month)
emcolix     = all_treatments.columns.get_loc('extramonths')
for i in range(0,originalN):
    monthstoadd = all_treatments.iloc[i,emcolix].astype('uint16')
    for x in range(0,monthstoadd):

最后一行显示了一个循环,该循环在 x = 3174 处以 monthstoadd = 62844 中断,这对于我使用的日期范围没有任何意义。

最佳答案

Pandas Series 中整数的默认数据类型是 int64——一个有符号 64 位整数。

In [82]: pd.Series([-2692]).dtype
Out[82]: dtype('int64')

如果您使用 astype 将数据类型转换为 uint16(一个无符号 16 位整数),则 int64 超出可表示为 uint16 的整数范围的值将强制转换为 uint16 值。例如,负数 int64 -2692 作为 uint16 映射到 62844:

In [80]: np.array([-2692], dtype='int64').astype('uint16')
Out[80]: array([62844], dtype=uint16)

以下是可表示为 int64 的整数范围:

In [83]: np.iinfo('int64')
Out[83]: iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

这里是可表示为 uint16s 的整数范围:

In [84]: np.iinfo('uint16')
Out[84]: iinfo(min=0, max=65535, dtype=uint16)

要调试此类问题,隔离出现该问题的玩具示例非常有用。例如,如果您运行

for i in range(0,originalN):
    monthstoadd = all_treatments.iloc[i,emcolix].astype('uint16')
    if monthstoadd == 62844:
        print(all_treatments.iloc[i,emcolix])
        print(all_treatments.iloc[i,emcolix].dtype)
        break

那么您将在调用 astype 之前看到 all_treatments.iloc[i,emcolix] 的值,以及 dtype。这将是发现问题根源的良好起点。

关于python - float 到 uint16 的转换会导致 numpy 中的数字增加吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32993340/

相关文章:

Python 3.3 - 将字典粘贴到 Excel

python - Conda 显示两个版本的请求库

python - 从数组创建 dask 数据框不保留列类型

python - python 中的 UTC 偏移量变得疯狂(to_datetime panda 函数和 datetime 对象)

python - 从同一单元格python中的列表中删除 float 出现

python - 如何在我的训练数据集中定义此列?

python - 为什么多行字符串在打印或写入时会发生变化? (Windows 上的 Python 3.6)

python - 如何通过 Selenium 和 Python 单击跨度类文本

python - 使用 jpg 格式将 numpy 数组保存为 io.BytesIO

python - Dataframe - 根据条件创建新列