我想以格式化的方式打印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()函数的基本机制,以及为什么它在这种特殊情况下不起作用。
答案 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)
查看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()
。