打印numpy timedelta64格式()

时间:2014-09-25 16:52:01

标签: python numpy

我想以格式化的方式打印numpy.timedelta64()值。直接方法效果很好:

>>> import numpy as np
>>> print np.timedelta64(10,'m')
10 minutes

我猜这来自__str__()方法

>>> np.timedelta64(10,'m').__str__()
'10 minutes'

但是当我尝试使用format()函数打印它时,我收到以下错误:

>>> print "my delta is : {delta}".format(delta=np.timedelta64(10,'m'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: don't know how to convert scalar number to long

我想了解&#34; string&#34; .format()函数的基本机制,以及为什么它在这种特殊情况下不起作用。

3 个答案:

答案 0 :(得分:3)

根据Format String Syntax documentation

  

转换字段会在格式化之前导致类型强制。   通常,格式化值的工作由__format __()完成   值本身的方法。但是,在某些情况下,它是可取的   强制将类型格式化为字符串,覆盖其自身   格式的定义。通过将值转换为字符串之前   调用__format __(),绕过正常的格式化逻辑。

>>> np.timedelta64(10,'m').__format__('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: don't know how to convert scalar number to long

通过附加!s conversion flag,您可以强制它使用str

>>> "my delta is : {delta!s}".format(delta=np.timedelta64(10,'m'))
'my delta is : 10 minutes'

答案 1 :(得分:2)

falsetru提到了问题的一个方面。另一个是为什么这个错误。

查看the code for __format__,我们发现它是一个通用实现。

重要的部分是:

    else if (PyArray_IsScalar(self, Integer)) {
#if defined(NPY_PY3K)
        obj = Py_TYPE(self)->tp_as_number->nb_int(self);
#else
        obj = Py_TYPE(self)->tp_as_number->nb_long(self);
#endif
    }

这会触发并尝试运行:

int(numpy.timedelta64(10, "m"))

但是Numpy(正确地)说你不能将单位数转换成原始数字。

这看起来像个错误。

答案 2 :(得分:1)

%s应该没问题。它会在对象上调用str()