无法找出如何将 datetime dtype 指定为 Numba @guvectorize

Unable to find out how to specify datetime dtype to Numba @guvectorize

我想在 Numba 中处理日期时间值数组。 我在一个小例子上尝试过,但我无法让它工作。

import numba as nb
from numba import guvectorize

@guvectorize('void(nb.types.NPDatetime("ns")[:],nb.types.NPDatetime("ns")[:])',
             '(m)->(m)')
def ts_copy(ts, ts_c):
    for idx, t in np.ndenumerate(ts):
        idx, = idx
        ts_c[idx] = t
        
ts = pd.date_range(start='2021/1/1 08:00', end='2021/1/1 18:00', freq='1H').to_numpy()
ts_c = np.empty(ts.size, dtype='datetime64[ns]')

res = ts_copy(ts, ts_c)

我收到以下错误消息:

Traceback (most recent call last):

  File "<ipython-input-39-1550d3aa0145>", line 3, in <module>
    def ts_copy(ts, ts_c):

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/np/ufunc/decorators.py", line 179, in wrap
    guvec.add(fty)

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/np/ufunc/ufuncbuilder.py", line 212, in add
    cres, args, return_type = _compile_element_wise_function(

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/np/ufunc/ufuncbuilder.py", line 144, in _compile_element_wise_function
    cres = nb_func.compile(sig, **targetoptions)

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/np/ufunc/ufuncbuilder.py", line 93, in compile
    return self._compile_core(sig, flags, locals)

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/np/ufunc/ufuncbuilder.py", line 124, in _compile_core
    args, return_type = sigutils.normalize_signature(sig)

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/core/sigutils.py", line 24, in normalize_signature
    parsed = _parse_signature_string(sig)

  File "/home/pierre/anaconda3/lib/python3.8/site-packages/numba/core/sigutils.py", line 14, in _parse_signature_string
    return eval(signature_str, {}, types.__dict__)

  File "<string>", line 1, in <module>

NameError: name 'nb' is not defined

拜托,有什么想法吗? 非常感谢你的帮助。 最佳,

guvectorize 不适用于日期时间类型。转换为浮点时间戳。

import numba as nb
from numba import guvectorize
import numpy as np
import pandas as pd
import arrow

@guvectorize([(nb.types.float64[:],nb.types.float64[:])],'(m)->(m)')
def ts_copy(ts, ts_c):
    for idx, t in np.ndenumerate(ts):
        idx, = idx
        ts_c[idx] = t


ts = pd.date_range(start='2021/1/1 08:00', end='2021/1/1 18:00', freq='1H').to_numpy()
ts_c = np.empty(ts.size, dtype='datetime64[ns]')

def e(_list):
    return np.array([arrow.get(str(_)).float_timestamp for _ in _list])


ts = e(ts)
ts_c = e(ts_c)


res = ts_copy(ts, ts_c)

for each in res:
    print(arrow.get(each))