21

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

例如:

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

7 回答 7

18

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

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

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

于 2017-08-30T20:12:42.740 回答
8

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'

等等....

于 2016-03-27T17:11:11.540 回答
6

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

这适用于两者:

>>> import datetime
>>> import numpy as np
>>> now = np.datetime64(datetime.datetime.now())
>>> (now.astype('uint64') / 1e6).astype('uint32')
1344447810
于 2012-08-08T15:10:11.490 回答
3

我想发布我发现的解决方案,我认为它可能比转换为 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')

我用它把从 pandas 中取出的 np.datetime64 列翻译成 unixtime 数组

于 2019-07-25T14:44:29.933 回答
1

首先你要知道数组的存储单元。然后您将数组视为 64 位整数并除以适当的比例因子以返回秒数。例如,如果您的日期时间数组以微秒 ( dtype=<M8[us]) 为存储单位存储,您可以这样做:

unix_time = dtarray.view("i8") / 1e6
于 2019-05-17T21:07:26.627 回答
0

这是@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

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

于 2022-03-02T10:04:50.357 回答
-1
def get_unixtime(time):    
    return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))

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

于 2012-08-08T13:21:09.953 回答