numpy 更改np.datetime64的分辨率,但在溢出时引发

zlhcx6iw  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(96)

如果我有一个datetime64[m]数组,我如何将它转换为datetime64[ms]并在溢出时出错?
例如:

np.array(['300000-01-01'], dtype='datetime64[m]').astype('datetime64[ms]')  # ok
np.array(['30000000000-01-01'], dtype='datetime64[m]').astype('datetime64[ms]')  # should error

字符串

gwo2fgha

gwo2fgha1#

我认为最好使用astype方法,并将所需的dtype指定为datetime64[ms],然后将原始数组与转换后的数组进行比较,以检查是否发生任何溢出!
看看这个

import numpy as np

array1 = np.array(['300000-01-01'], dtype='datetime64[m]')
array2 = np.array(['30000000000-01-01'], dtype='datetime64[m]')

array1_ms = array1.astype('datetime64[ms]')
array2_ms = array2.astype('datetime64[ms]')

# in this case I'll check overflow
if np.any(array1 != array1_ms):
    raise OverflowError("overflow detected in array1")

if np.any(array2 != array2_ms):
    raise OverflowError("overflow detected in array2")

字符串

brqmpdu1

brqmpdu12#

如果你检查底层数据类型integer的转换,以标量形式逐个元素地检查,你可能会得到一个警告:

import warnings
import numpy as np

a0 = np.array(['300000-01-01'], dtype='datetime64[m]')
a1 = np.array(['30000000000-01-01'], dtype='datetime64[m]')

# minutes to milliseconds is a factor of 60 * 1000
conversion_factor = 60 * 1000

with warnings.catch_warnings():
    warnings.filterwarnings('error')
    for arr in a0, a1:
        try:
            arr[0].astype(int) * conversion_factor
        except Warning as e:
            print(arr)
            print('error encountered:', e)

# ['30000000000-01-01T00:00']
# error encountered: overflow encountered in scalar multiply

字符串
但是,这并不适用于整个数组;整数就在那里无声地溢出。
你可以做的是检查转换回整数表示的原始分辨率是否会得到相同的结果:

for arr in a0, a1:
    print(arr)
    print(
        arr.astype(int) == arr.astype("datetime64[ms]").astype(int) // conversion_factor
    )
    
# ['300000-01-01T00:00']
# [ True]
# ['30000000000-01-01T00:00']
# [False]

相关问题