2014-09-25 3 views
2

Я хотел бы напечатать значение numpy.timedelta64() форматированным способом. Прямой метод хорошо работает:печать numpy timedelta64 с форматом()

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

который я предполагаю, что происходит от метода

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

__str__() Но когда я пытаюсь напечатать его с помощью функции формата(), я получаю следующее сообщение об ошибке:

>>> 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 

Я хотел бы понять базовый механизм функции «string» .format() и почему он не работает в данном конкретном случае.

ответ

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 (справедливо) говорит, что вы не можете преобразовать число с единицами на сырой номер.

Это похоже на ошибку.

+0

Как вы думаете, я должен где-то подать сообщение об ошибке? –

+0

[Я только что сделал это для вас.] (Https://github.com/numpy/numpy/issues/5121) – Veedrac

1

%s должно быть хорошо. Он вызывает str() на объекте.

3

Согласно Format String Syntax documentation:

The conversion field causes a type coercion before formatting. Normally, the job of formatting a value is done by the __format__() method of the value itself. However, in some cases it is desirable to force a type to be formatted as a string, overriding its own definition of formatting. By converting the value to a string before calling __format__(), the normal formatting logic is bypassed.

>>> 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

Благодарим falsetru за ваше решение, я использую его прямо сейчас в своем коде, но я выбираю ответ Veedrac для перехода к неудачной строке и указания потенциальной ошибки. –

Смежные вопросы