如何从 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]
在转换为整数之前转换为“秒”(the )。这适用于 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'
等等....
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
我想发布我发现的解决方案,我认为它可能比转换为 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 数组
首先你要知道数组的存储单元。然后您将数组视为 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
or 'int'
(本机 Python 类型),因为这会给出不正确的结果。相关:将 numpy.datetime64 转换为 int 时出错。
def get_unixtime(time):
return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))
似乎返回了 UNIX 时间戳,我只检查了几个日期。