如何通过NumPy C API获取datetime64数组的分辨率?
获取NumPy datetime64数组的分辨率(C API)
在Python中,我们可以直接通过dtype查看datetime64数组的分辨率:
>>> np.array([np.datetime64('2001-01-01'), np.datetime64('2001-01-02')]).dtype dtype('<M8[D]') >>> np.array([np.datetime64('2001-01'), np.datetime64('2001-02')]).dtype dtype('<M8[M]')
但在NumPy C API中,若遇到空数组(比如np.array([], dtype=np.dtype('datetime64[D]'))),无法通过转换元素标量的方式获取分辨率。此时可通过以下两种方式获取:
方法1:使用PyArray_GetDatetimeResolution函数
NumPy提供了专门的API函数获取datetime64类型的分辨率,无需依赖数组元素:
#include <numpy/arrayobject.h> // 假设obj是传入的PyArrayObject指针 PyArray_Descr* descr = PyArray_DESCR((PyArrayObject*)obj); // 先确认是datetime类型 if (descr->kind == 'M') { NPY_DATETIMEUNIT res = PyArray_GetDatetimeResolution(descr); // 根据res的值判断分辨率: switch(res) { case NPY_FR_Y: // 年分辨率 break; case NPY_FR_M: // 月分辨率 break; case NPY_FR_D: // 天分辨率 break; case NPY_FR_h: // 小时分辨率 break; // 其他分辨率枚举包括NPY_FR_m(分钟)、NPY_FR_s(秒)、NPY_FR_ms(毫秒)等 } }
方法2:直接访问描述符的metadata字段
datetime64的分辨率信息也存储在PyArray_Descr的metadata结构体中,可直接访问:
#include <numpy/arrayobject.h> PyArray_Descr* descr = PyArray_DESCR((PyArrayObject*)obj); if (descr->kind == 'M') { // metadata指向NpyDatetimeDescr结构体 NpyDatetimeDescr* datetime_descr = (NpyDatetimeDescr*)descr->metadata; NPY_DATETIMEUNIT res = datetime_descr->res; // 同样可以通过switch判断具体分辨率 }
注意:使用前需确保已正确初始化NumPy C API(调用import_array()),上述API在NumPy 1.7及以上版本可用。
内容的提问来源于stack exchange,提问作者Kian Shepherd
相关产品推荐
相关产品推荐

