繁体   English   中英

浮点数到uint16转换使numpy中的数字激增?

[英]float to uint16 conversion blowing numbers up in numpy?

我的数据每天都有indate小号1947年至2012年和outdate期从1997年至2012年,我不明白是怎么线下方可能导致monthstoadd = 62844 (这吹一段时间偏移了)。 可以循环使用uint16吗? 为什么会这样呢?

下面的线适用于那些数据INDATUMAUTDATUMA的格式为20071231,例如日期解析似乎对工作indateoutdate ,这些值是有意义的。 (我展示的代码超出了严格必要的代码,因为我对应该正常工作的假设在某处显然是错误的,所以也许我错了什么。数据结构来自熊猫。)

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系列中整数的默认dtype是int64符号的 64位整数。

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

如果使用astypeastype转换为uint16 (一个无符号的 16位整数),那么int64值(可作为uint16表示的int范围之外)将转换为uint16值。 例如,负数int64 -2692被映射为62844作为uint16

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

这是可表示为int64的int范围:

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

这是可表示为uint16 s的int范围:

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

那么你会看到的价值all_treatments.iloc[i,emcolix]调用之前astype ,也是dtype 这将是发现问题根源的一个很好的起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM