Python 浮点数到uint16的转换以numpy为单位放大数字?

Python 浮点数到uint16的转换以numpy为单位放大数字?,python,numpy,pandas,casting,type-conversion,Python,Numpy,Pandas,Casting,Type Conversion,我的数据从1947年到2012年每日indates,从1997年到2012年outdates。我不明白下面的几行怎么会导致一个月toadd=62844(这会导致一些时间偏移)。是否可以转换为uint16以便在循环中使用?为什么,人们能做些什么呢 以下行适用于INDATUMA和UTDATUMA格式为20071231的数据,例如,日期解析似乎适用于indate和outdate,这些值是有意义的。 (我展示的代码比严格必要的代码要多,因为我关于什么应该起作用的假设在某些地方显然是错误的,所以可能我在什

我的数据从1947年到2012年每日
indate
s,从1997年到2012年
outdate
s。我不明白下面的几行怎么会导致一个
月toadd=62844
(这会导致一些时间偏移)。是否可以转换为uint16以便在循环中使用?为什么,人们能做些什么呢

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


最后一行显示了一个循环,该循环在
x=3174
处中断,其中
月份toadd=62844
,这对我使用的日期范围没有意义。

熊猫系列中整数的默认数据类型是
int64
——一个有符号的64位整数

In [82]: pd.Series([-2692]).dtype
Out[82]: dtype('int64')
如果使用
astype
将数据类型转换为
uint16
——一个无符号的16位整数,则
int64
值(不在可表示为
uint16
的int范围内)将转换为
uint16
值。例如,负的
int64
-2692作为
uint16
映射到62844:

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

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

In [83]: np.iinfo('int64')
Out[83]: iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
以下是可表示为
uint16
s的整数范围:

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\u treatments.iloc[i,emcolix]
的值,以及
dtype
。这将是发现问题根源的良好起点。

谢谢,我早就料到了。我没有负值,最大值是几千,在uint16的范围内。或者uint16仍然会中断循环解析?所有治疗['extramonths']的数据类型是什么?在循环中使用
uint16
应该没有问题。谢谢,我正在仔细检查我的值是否有负片。也就是说,-2692将是数据中的一个主要编码错误(某人在进入医院224年前离开医院-这仍然与我检查的日期范围不一致)。
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