【问题标题】:How to get unix timestamp from numpy.datetime64如何从 numpy.datetime64 获取 unix 时间戳
【发布时间】:2012-08-05 14:50:44
【问题描述】:

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

例如:

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

【问题讨论】:

  • 根据文档 datetime64 在numpy 1.6 中并不可靠。即使对于 1.7,api 也是实验性的。所以我不确定你是否会在不同的平台和架构(64 位?)上获得一致的结果。 pandas 0.8 release notes 中提供了更多信息。所以不确定,在 numpy 1.6 上使用 datetime64 是否是一个不错的选择。
  • 是的,因为代码本身是实验性的,并且只驻留在一台机器上,如果它工作一次就可以被认为可以工作?
  • 好的,但是您应该在问题中指定 numpy 版本、平台和架构(可能是 python 版本,2 和 3 的结果相同?)。否则可能会对阅读它的人产生误导。
  • 进一步说 `np.datetime64('now') 似乎只返回我设置的日期,没有时间信息。
  • 我实际上根本没有使用 datetime64('now'),所以我通过用恒定时间替换它来更新问题。

标签: python numpy


【解决方案1】:
def get_unixtime(time):    
    return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))

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

【讨论】:

  • 你真的测试过这个吗?我得到 1344
  • 我收到 1344384000,2 小时后 ;-)。我在 64 位机器和 tz utc+2 上。
  • @jterrace,是的,我测试过,我在 64 位 Ubuntu 上运行最新的 numpy,也在 64 位 Vista 上测试过。我得到 1344384000
  • 我得到了 1.6.1 的值,但我得到了 1.7.0 的 32 位值
【解决方案2】:

在 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

【讨论】:

  • 我收到 1344384000000000,2 小时后 ;-)。我在 64 位机器和 tz utc+2 上。
  • 在 1.6.1 + Ubuntu 中,我得到 64 位数字,但在我的 1.7.0-dev 的 mac 上,我得到 32 位值..
  • @bmu 更新了答案 - 在 1.6.1 和 1.7 上似乎有所不同
  • 我用的是 series.astype(np.int64)
  • 要获取自纪元以来的当前秒数,您可以这样做:np.datetime64('now').astype(uint32);不需要日期时间库
【解决方案3】:

numpy datetime64 有可变单位:

摘自official doc:

内部存储的单位是自动从字符串的形式中选择的,可以是日期单位,也可以是时间单位。日期单位是年 ('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'

等等……

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 需要注意的是,由于视图不会创建副本,所以这里对dtarray的更改也会反映到unix_time
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-08
        • 2012-06-23
        • 1970-01-01
        • 2012-12-09
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        相关资源
        最近更新 更多