You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:16