2 Stimmen

Drucken von numpy timedelta64 mit format()

Ich möchte einen Wert von numpy.timedelta64() in einem formatierten Stil ausgeben. Die direkte Methode funktioniert gut:

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

Was ich vermute, kommt von der __str__() Methode

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

Aber wenn ich versuche, es mit der format() Funktion auszugeben, erhalte ich den folgenden Fehler:

>>> print "mein Delta ist: {delta}".format(delta=np.timedelta64(10,'m'))
Traceback (most recent call last):
  File "", line 1, in 
TypeError: dont know how to convert scalar number to long

Ich möchte den zugrundeliegenden Mechanismus der "string".format() Funktion verstehen und warum sie in diesem speziellen Fall nicht funktioniert.

4voto

falsetru Punkte 353059

Laut der Format String Syntax-Dokumentation:

Das Umwandlungsfeld verursacht eine Typenumwandlung vor dem Formatieren. Normalerweise wird die Aufgabe des Formatierens eines Werts von der Methode __format__() des Werts selbst erledigt. In einigen Fällen ist es jedoch erwünscht, einen Typ als Zeichenfolge zu formatieren, wodurch dessen eigene Definition des Formatierens überschrieben wird. Durch die Umwandlung des Werts in eine Zeichenfolge, bevor __format__() aufgerufen wird, wird die normale Formatierungslogik umgangen.

np.timedelta64(10,'m').format('') Traceback (zuletzt aufgerufener Aufruf): Datei "", Zeile 1, in TypeError: weiß nicht, wie ein einzelner Zahlenskalar in einen langen Wert konvertiert werden kann


Durch Anhängen des !s-Konvertierungsflags können Sie erzwingen, str zu verwenden:

>>> "mein Delta beträgt : {delta!s}".format(delta=np.timedelta64(10,'m'))
'mein Delta beträgt : 10 Minuten'

2voto

Veedrac Punkte 54089

Falsetru nennt einen Aspekt des Problems. Der andere ist, warum überhaupt diese Fehler auftreten.

Beim Blick auf den Code für __format__ sehen wir, dass es sich um eine generische Implementierung handelt.

Der wichtige Teil ist:

    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
    }

Dies löst aus und versucht auszuführen:

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

aber Numpy (zu Recht) sagt, dass man eine Zahl mit Einheiten nicht in eine Rohzahl umwandeln kann.

Dies scheint ein Fehler zu sein.

1voto

ivan_pozdeev Punkte 30938

%s sollte in Ordnung sein. Es ruft str() auf dem Objekt auf.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X