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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:52:35