如果我有一个datetime64[m]数组,我如何将它转换为datetime64[ms]并在溢出时出错?例如:
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
字符串
gwo2fgha1#
我认为最好使用astype方法,并将所需的dtype指定为datetime64[ms],然后将原始数组与转换后的数组进行比较,以检查是否发生任何溢出!看看这个
astype
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")
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]
型
2条答案
按热度按时间gwo2fgha1#
我认为最好使用
astype
方法,并将所需的dtype指定为datetime64[ms]
,然后将原始数组与转换后的数组进行比较,以检查是否发生任何溢出!看看这个
字符串
brqmpdu12#
如果你检查底层数据类型integer的转换,以标量形式逐个元素地检查,你可能会得到一个警告:
字符串
但是,这并不适用于整个数组;整数就在那里无声地溢出。
你可以做的是检查转换回整数表示的原始分辨率是否会得到相同的结果:
型