将numpy datetime64转换为numba jitclass下的unix时间戳

1 投票
1 回答
19 浏览
提问于 2025-04-14 18:04

为了让代码更容易阅读,我想在一个 numba 的 jitclass 中使用 numpy.datetime64 对象,并希望在这个类内部把它转换成浮点格式的 unix 时间戳。

目前,我只能在创建 jitclass 对象之前先计算好 unix 时间戳,然后把这个时间戳作为参数传进去,比如:

>>> import numpy as np
>>> (np.datetime64('2024-01-01T00:00:00') - np.datetime64('1970-01-01T00:00:00')) / np.timedelta64(1, 's')
1704067200.0

假设我创建了一个接收 numpy datetime 作为参数的 jitclass,我该如何在这个类里面创建一个方法,把 datetime 转换成 unix 时间戳呢?最终的目标是,在创建 jitclass 对象时提供一个开始和结束日期,然后把它们转换成 unix 时间戳,以便使用 np.arange() 创建一个时间戳数组。

import numpy as np
from numba.experimental import jitclass
from numba import types

spec=[
    ('start', types.NPDatetime('s'))
]

@jitclass(spec)
class Foo():

    def __init__(self, start):
        self.start = start

obj = Foo(np.datetime64('2024-01-01T00:00:00'))
>>> obj.start
numpy.datetime64('2024-01-01T00:00:00')

1 个回答

1

如果我理解得没错,你想在Foo这个类里创建一个类似于to_timestamp()的方法:

import numba as nb
import numpy as np

spec = [("start", nb.types.NPDatetime("s"))]

_unix_timestamp_begin = np.datetime64("1970-01-01T00:00:00")
_one_second = np.timedelta64(1, "s")


@nb.experimental.jitclass(spec)
class Foo:
    def __init__(self, start):
        self.start = start

    def to_timestamp(self):
        return (self.start - _unix_timestamp_begin) / _one_second


obj = Foo(np.datetime64("2024-01-01T00:00:00"))
print(obj.to_timestamp())

输出结果是:

1704067200.0

撰写回答