浮点数到uint16的转换在numpy中爆炸?

2024-09-26 22:54:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据有1947年至2012年的每日indate和1997年至2012年的outdate。我不明白下面的行怎么会导致monthstoadd = 62844(这会放大一些时间偏移量)。它能转换成uint16在循环中使用吗?为什么,你能做什么呢?在

下面的行适用于INDATUMA和{}格式为20071231的数据,例如,日期解析似乎适用于indate和{},这些值是有意义的。 (我展示的代码比严格意义上的要多,因为我对什么应该起作用的假设在某些地方显然是错误的,所以我可能在什么地方出错了。数据结构来自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与{}断开,这对于我使用的日期范围没有意义。在


Tags: to数据datetime地方dtallpd意义
1条回答
网友
1楼 · 发布于 2024-09-26 22:54:45

Pandas系列中整数的默认数据类型是int64a有符号64位整数。在

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

如果您使用astype将数据类型转换为uint16一个无符号16位整数,那么int64值将转换为uint16s表示的整数范围之外的值。例如,负数int64-2692被映射到62844,作为uint16

^{pr2}$

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

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。这将是发现问题根源的良好起点。在

相关问题 更多 >

    热门问题