【问题标题】:Time difference in seconds from numpy.timedelta64与 numpy.timedelta64 的时间差(以秒为单位)
【发布时间】:2013-02-17 12:07:10
【问题描述】:

如何从 numpy.timedelta64 变量中获取以秒为单位的时差?

time1 = '2012-10-05 04:45:18'
time2 = '2012-10-05 04:44:13'
dt = np.datetime64(time1) - np.datetime64(time2)
print dt

0:01:05

我想将dt 转换为以秒为单位表示时差的数字(整数或浮点数)。

【问题讨论】:

    标签: python datetime numpy


    【解决方案1】:

    使用numpy 1.7 experimental datetime APInumpy.timedelta64()对象获取秒数:

    seconds = dt / np.timedelta64(1, 's')
    

    【讨论】:

    • 我们可能使用不同的版本?尝试np.timedelta64(1, 's')时我有TypeError: function takes at most 1 argument (2 given)
    • @wim:是的。 1.6 and 1.7 API differ.
    • 对于 pandas 系列,使用 series.apply(lambda x: x / timedelta64(1, 's')) (NumPy 1.7.1, pandas 0.12.0)
    • 将相同逻辑应用于系列的另一种方式:np.divide(mySeries, np.timedelta64(1, 's')) 比上述 apply 方法快 70 倍左右
    • 我收到TypeError: ufunc divide cannot use operands with types dtype('<M8[us]') and dtype('<m8[s]')
    【解决方案2】:

    您可以通过“包装的”日期时间项访问它:

    >>> dt.item().total_seconds()
    65.0
    

    解释:这里的dtnumpy中的一个array scalar,它是一个零秩数组或0维数组。所以你会发现这里的dt 也有ndarray 拥有的所有方法,例如dt.astype('float')。但它包装了一个 python 对象,在本例中是一个 datetime.timedelta 对象。

    要获得原始标量,您可以使用dt.item()。要索引数组标量,您可以使用 getitem 的有点奇怪的语法,使用一个空元组:

    >>> dt[()]
    array(datetime.timedelta(0, 65), dtype='timedelta64[s]')
    

    这应该适用于所有版本的 numpy,但如果您使用的是 numpy v1.7+,最好直接使用较新的 numpy datetime API,如J.F. Sebastien 的回答中所述。

    【讨论】:

    • 谢谢,成功了。你能解释一下为什么 dt.seconds 不起作用吗?
    • datetime.timedelta 具有类似名称的属性,而不是 numpy.timedelta64。我不知道为什么 numpy 会这样实现它,也许其他人可以回答..
    • 值得注意的是:如果timedelta64 对象的dtype 为timedelta64[ns],这将不起作用,您需要先转换为timedelta64[s](即dt.astype('timedelta64[s]').item().total_seconds())。我被这个咬过很多次了
    【解决方案3】:

    您可以使用 np.astype 简单地将值转换为所需的时间单位,如示例所示:

    timedelta = np.datetime64('2011-07-18')-np.datetime64('2011-07-16')
    seconds = timedelta.astype('timedelta64[s]').astype(np.int32)
    hours = timedelta.astype('timedelta64[h]').astype(np.int32)
    

    【讨论】:

    • timedelta.astype('timedelta64[s]') 对我来说似乎截断了毫秒精度``[147] elapsed_time.iloc[0] Timedelta('0 days 00:00:00.005322600') [148] elapsed_time.iloc[0] / np.timedelta64(1, 's') 0.0053226 [149] elapsed_time.astype('timedelta64[s]').astype(np.float64).iloc[0] 0.0 ``
    • 很好 - 错过了中间类型转换
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多