如何从numpy.datetime64获取unix时间戳



如何从numpy.datetime64或numpy.datetime_获取UNIX时间?

例如:

np.datetime_('2012-08-08 13:37:00')

为了解释单位,我认为您需要执行以下操作:

def get_unixtime(dt64):
    return dt64.astype('datetime64[s]').astype('int')

请注意,这会在转换为整数之前转换为"秒"([s])。这适用于 NumPy 1.12.1。

numpy datetime64 具有可变单位:

摘自官方文档:

内部存储的单位是从字符串的形式中自动选择的,可以是日期单位或时间单位。日期单位是年 ("Y")、月("M")、周 ("W") 和天 ("D"),而时间单位是小时 ("h")、分钟 ("m")、秒 ('s')、毫秒 ('ms') 和一些额外的基于秒的 SI 前缀单位。

因此,首先我们需要使用 dtype 检查当前单位,例如:

>>> now = np.datetime64(datetime.datetime.now())
>>> now.dtype
# for ns unit, use:
dtype('<M8[ns]')
now.astype('int64')/1e9, dtype='int32'
# for us unit, use:
dtype('<M8[us]')
now.astype('int64')/1e6, dtype='int32'
# for ms unit, use:
dtype('<M8[ms]')
now.astype('int64')/1e3, dtype='int32'

等等....

我想

发布我发现的解决方案,我认为这可能比转换为 uint 要好一些,因为我觉得类型转换可能存在问题。

>>> import numpy as np
>>> now = np.datetime64('now')
>>> ux_time = now.astype(np.timedelta64) / np.timedelta64(1, 'ms')

我觉得这个解决方案更好一点,因为它允许您选择unix时间单位。对于我正在从事的项目,我们使用"ms",但如果需要,您可以指定不同的单位。

此外,这允许使用 numpy 输入 datetime64 数组以转换为 timedelta64:

>>> date_time_array.astype(np.timedelta64) / np.timedelta64(1, 'ms')

我用它来将从熊猫中获取的 np.datetime64 列转换为 unixtime 数组

我在 numpy 1.6.1 与 1.7 上的 np.datetime64('now') 值得到不一致的结果。

这适用于以下两种情况:

>>> import datetime
>>> import numpy as np
>>> now = np.datetime64(datetime.datetime.now())
>>> (now.astype('uint64') / 1e6).astype('uint32')
1344447810

首先,您必须知道数组的存储单元。然后,将数组视为 64 位整数,并除以适当的比例因子以返回到秒。例如,如果您的日期时间数组以微秒 (dtype=<M8[us] ) 的存储单位存储,则可以执行以下操作:

unix_time = dtarray.view("i8") / 1e6

这是 @farenorth 的答案的扩展和修改版本,它允许指定输出的精度:

from datetime import datetime, timezone
import numpy as np
# np.__version__: '1.21.5'
def get_unixtime(dt64, unit='s'):
    return dt64.astype(f'datetime64[{unit}]').astype(np.int64)
print(datetime(2022,3,2,tzinfo=timezone.utc).timestamp())
# 1646179200.0 # unix time in seconds
dt = np.datetime64(datetime(2022,3,2)) # tz naive in numpy!
for unit in 's', 'ms', 'us', 'ns':
    print(f"precision: {unit}, -> {get_unixtime(dt, unit)}")
# precision: s, -> 1646179200
# precision: ms, -> 1646179200000
# precision: us, -> 1646179200000000
# precision: ns, -> 1646179200000000000

作为旁注,我们不能在这里使用 int'int'(原生 Python 类型),因为这会产生不正确的结果。相关:将 numpy.datetime64 转换为 int 时出错。

def get_unixtime(time):    
    return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))

似乎返回了UNIX时间戳,我只检查了几个日期。

最新更新