Numpy中datetime64数组求中位数触发UFuncBinaryResolutionError报错
numpy日期数组计算中位数报错问题
问题重现
使用numpy生成日期数组后,调用np.median()计算中位数触发报错:
可复现代码:
import numpy as np dt_array = np.array([np.datetime64('2024-08-16'), np.datetime64('2024-08-15')]) np.median(dt_array)
报错信息:
Traceback (most recent call last): File "C:\Users\ACENTAURI-1009\Desktop\pdf.py", line 5, in <module> np.median(dt_array) File "C:\Users\ACENTAURI-1009\AppData\Local\Programs\Python\Python312\Lib\site-packages\numpy\lib\function_base.py", line 3927, in median return _ureduce(dt_array, func=_median, keepdims=keepdims, axis=axis, out=out, File "C:\Users\ACENTAURI-1009\AppData\Local\Programs\Python\Python312\Lib\site-packages\numpy\lib\function_base.py", line 3823, in _ureduce r = func(dt_array , **kwargs) File "C:\Users\ACENTAURI-1009\AppData\Local\Programs\Python\Python312\Lib\site-packages\numpy\lib\function_base.py", line 3979, in _median rout = mean(part[indexer], axis=axis, out=out) File "C:\Users\ACENTAURI-1009\AppData\Local\Programs\Python\Python312\Lib\site-packages\numpy\core\fromnumeric.py", line 3504, in mean return _methods._mean(dt_array, axis=axis, dtype=dtype, File "C:\Users\ACENTAURI-1009\AppData\Local\Programs\Python\Python312\Lib\site-packages\numpy\core\_methods.py", line 118, in _mean ret = umr_sum(arr, axis, dtype, out, keepdims, where=where) numpy.core._exceptions._UFuncBinaryResolutionError: ufunc 'add' cannot use operands with types dtype('<M8[D]') and dtype('<M8[D]')
报错原因
np.median()处理偶数个元素的数组时,会计算中间两个元素的平均值。但numpy的datetime64类型不支持加法和除法运算(日期相加无实际意义),因此触发加法操作的类型错误。
解决方法
方法1:转换为数值类型计算后转回
将日期数组转为int64类型(对应时间戳数值),计算中位数后再转回datetime64:
import numpy as np dt_array = np.array([np.datetime64('2024-08-16'), np.datetime64('2024-08-15')]) # 转换为int64(以天为单位的数值) dt_int = dt_array.astype(np.int64) # 计算中位数 median_int = np.median(dt_int) # 转回datetime64类型 median_dt = np.datetime64(int(median_int), 'D') if median_int.is_integer() else np.datetime64(median_int, 'D') print(median_dt) # 输出:2024-08-15T12:00:00(保留小数则为中间时刻)
方法2:手动处理中位数(贴合日期业务逻辑)
由于“平均日期”在多数场景下无实际意义,可直接取排序后数组的中间元素(偶数个时选左或右均可):
import numpy as np dt_array = np.array([np.datetime64('2024-08-16'), np.datetime64('2024-08-15')]) # 先排序日期数组 sorted_dt = np.sort(dt_array) n = len(sorted_dt) # 计算中位数 if n % 2 == 1: median_dt = sorted_dt[n // 2] else: # 可选中间靠左的元素,或改为sorted_dt[n//2]取靠右的元素 median_dt = sorted_dt[(n // 2) - 1] print(median_dt) # 输出:2024-08-15
内容的提问来源于stack exchange,提问作者Bhargav
相关产品推荐
相关产品推荐

