822 Stimmen

Wie drucke ich ein Datum in einem normalen Format?

Dies ist mein Code:

import datetime
today = datetime.date.today()
print(today)

Dies wird gedruckt: 2008-11-22 Das ist genau das, was ich will.

Aber ich habe eine Liste, an die ich das anhänge, und dann geht plötzlich alles "schief". Hier ist der Code:

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

Es wird Folgendes ausgedruckt:

[datetime.date(2008, 11, 22)]

Wie kann ich nur ein einfaches Datum wie 2008-11-22 ?

16 Stimmen

Die kurze Antwort: Durch die Anwendung str() (zu jedem Element der Liste), denn das ist genau das, was print stillschweigend mit Ihrem Solo gemacht today Objekt.

1 Stimmen

1100voto

e-satis Punkte 547539

Das WARUM: Daten sind Objekte

In Python sind Daten Objekte. Wenn Sie sie manipulieren, manipulieren Sie daher Objekte, keine Zeichenketten oder Zeitstempel.

Jedes Objekt in Python hat ZWEI String-Repräsentationen:

  • Die reguläre Darstellung, die von print kann mit der Funktion str() Funktion. Es ist meist das gängigste für den Menschen lesbare Format und wird zur Vereinfachung der Anzeige verwendet. Also str(datetime.datetime(2008, 11, 22, 19, 53, 42)) gibt Ihnen '2008-11-22 19:53:42' .

  • Die alternative Darstellung, die verwendet wird, um die Art des Objekts (als Daten) darzustellen. Sie kann mit der Option repr() Funktion und ist praktisch, um zu wissen, welche Art von Daten Sie während der Entwicklung oder Fehlersuche bearbeiten. repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) gibt Ihnen 'datetime.datetime(2008, 11, 22, 19, 53, 42)' .

Wenn Sie das Datum mit print verwendet es str() damit Sie eine schöne Datumsfolge sehen können. Aber wenn Sie gedruckt haben mylist haben Sie eine Liste von Objekten gedruckt und mit Python versucht, die Datenmenge darzustellen, indem Sie repr() .

Das Wie: Was wollen Sie damit machen?

Nun, wenn Sie Daten manipulieren, verwenden Sie die Datumsobjekte die ganze Zeit über. Sie haben tausende von nützlichen Methoden und die meisten der Python-API erwarten, dass Datumsangaben Objekte sind.

Wenn Sie sie anzeigen möchten, verwenden Sie einfach str() . In Python ist es eine gute Praxis, alles explizit zu casten. Wenn es also an der Zeit ist, zu drucken, erhalten Sie eine String-Repräsentation Ihres Datums mit str(date) .

Eine letzte Sache. Als Sie versucht haben, die Daten zu drucken, haben Sie mylist . Wenn Sie ein Datum drucken wollen, müssen Sie die Datumsobjekte drucken, nicht ihren Container (die Liste).

Sie möchten z. B. alle Daten in einer Liste drucken:

for date in mylist :
    print str(date)

Beachten Sie, dass in diesem speziellen Fall können Sie auch weglassen str() denn der Druck wird ihn für Sie verwenden. Aber es sollte nicht zur Gewohnheit werden :-)

Praktischer Fall, unter Verwendung Ihres Codes

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

Erweiterte Datumsformatierung

Datumsangaben haben eine Standarddarstellung, aber Sie möchten sie vielleicht in einem bestimmten Format ausgeben. In diesem Fall können Sie eine benutzerdefinierte Zeichenkettendarstellung erhalten, indem Sie die strftime() Methode.

strftime() erwartet ein Zeichenkettenmuster, das angibt, wie Sie Ihr Datum formatieren möchten.

E.G :

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

Alle Buchstaben nach einem "%" ein Format für etwas darstellen:

  • %d ist die Tagesnummer (2 Ziffern, ggf. mit vorangestellten Nullen)
  • %m ist die Monatsnummer (2 Ziffern, ggf. mit vorangestellten Nullen)
  • %b ist die Monatsabkürzung (3 Buchstaben)
  • %B ist der vollständige Monatsname (Buchstaben)
  • %y ist die abgekürzte Jahreszahl (die letzten 2 Ziffern)
  • %Y ist die volle Jahreszahl (4 Ziffern)

usw.

Werfen Sie einen Blick auf die offizielle Dokumentation o McCutchen's Schnellreferenz man kann sie nicht alle kennen.

Desde PEP3101 Jedes Objekt kann sein eigenes Format haben, das automatisch von der Methode format of any string verwendet wird. Im Fall von datetime ist das Format das gleiche, das in strftime. Sie können also das Gleiche wie oben tun, wie folgt:

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

Der Vorteil dieser Form ist, dass Sie gleichzeitig auch andere Objekte umwandeln können.
Mit der Einführung von Formatierte String-Literale (seit Python 3.6, 2016-12-23) kann dies geschrieben werden als

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

Lokalisierung

Daten können sich automatisch an die lokale Sprache und Kultur anpassen, wenn man sie richtig einsetzt, aber das ist etwas kompliziert. Vielleicht für eine andere Frage auf SO(Stack Overflow) ;-)

3 Stimmen

BTW Fast jeder Datentyp in Python ist eine Klasse (außer immutables, aber die können subclassed werden) stackoverflow.com/questions/865911/

1 Stimmen

Was meinen Sie mit "fast"? str und int haben eine Klasse Attribut, das "type" enthält, gibt es also selbst Klassen, da sie Instanzen der Metaklasse type sind.

4 Stimmen

Dies ist genau die Frage der Terminologie: Typ != Klasse?, d.h. reicht es aus, ein Typ-Attribut zu haben (einen Mechanismus zur Typ-Inferenz bereitzustellen, um für ein Objekt qualifiziert zu sein) oder sollte sich eine Entität wie ein Objekt verhalten. Ich versuche, dies hier für mich zu klären programmers.stackexchange.com/questions/164570/

424voto

Daniel Magnusson Punkte 9281
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Edit :

Nach Cees' Vorschlag Ich habe begonnen, auch die Zeit zu nutzen:

import time
print time.strftime("%Y-%m-%d %H:%M")

2 Stimmen

Sie können von datetime import datetime und dann print datetime().now().strftime("%Y-%m-%d %H:%M") . Nur ein Unterschied in der Syntax.

9 Stimmen

from datetime import date; date.today().strftime("%Y-%m-%d") sieht für mich immer noch unpythonisch aus, aber das ist das Beste ohne import time . Ich glaube, das datetime-Modul ist für die Datumsberechnung gedacht.

2 Stimmen

Mein Favorit ist from datetime import datetime as dt und jetzt können wir spielen mit dt.now()

203voto

Transformer Punkte 3472

El date , datetime y time Objekte unterstützen alle eine strftime(format) Methode, um eine Zeichenkette zu erstellen, die die Zeit unter der Kontrolle eines expliziten Format Zeichenkette.

Hier finden Sie eine Liste der Formatcodes mit ihren Richtlinien und ihrer Bedeutung.

%a  Locale’s abbreviated weekday name.
%A  Locale’s full weekday name.      
%b  Locale’s abbreviated month name.     
%B  Locale’s full month name.
%c  Locale’s appropriate date and time representation.   
%d  Day of the month as a decimal number [01,31].    
%f  Microsecond as a decimal number [0,999999], zero-padded on the left
%H  Hour (24-hour clock) as a decimal number [00,23].    
%I  Hour (12-hour clock) as a decimal number [01,12].    
%j  Day of the year as a decimal number [001,366].   
%m  Month as a decimal number [01,12].   
%M  Minute as a decimal number [00,59].      
%p  Locale’s equivalent of either AM or PM.
%S  Second as a decimal number [00,61].
%U  Week number of the year (Sunday as the first day of the week)
%w  Weekday as a decimal number [0(Sunday),6].   
%W  Week number of the year (Monday as the first day of the week)
%x  Locale’s appropriate date representation.    
%X  Locale’s appropriate time representation.    
%y  Year without century as a decimal number [00,99].    
%Y  Year with century as a decimal number.   
%z  UTC offset in the form +HHMM or -HHMM.
%Z  Time zone name (empty string if the object is naive).    
%%  A literal '%' character.

Das können wir mit den Modulen datetime und time in Python tun

import time
import datetime

print "Time in seconds since the epoch: %s" %time.time()
print "Current date and time: ", datetime.datetime.now()
print "Or like this: ", datetime.datetime.now().strftime("%y-%m-%d-%H-%M")

print "Current year: ", datetime.date.today().strftime("%Y")
print "Month of year: ", datetime.date.today().strftime("%B")
print "Week number of the year: ", datetime.date.today().strftime("%W")
print "Weekday of the week: ", datetime.date.today().strftime("%w")
print "Day of year: ", datetime.date.today().strftime("%j")
print "Day of the month : ", datetime.date.today().strftime("%d")
print "Day of week: ", datetime.date.today().strftime("%A")

Der Ausdruck sieht dann etwa so aus:

Time in seconds since the epoch:    1349271346.46
Current date and time:              2012-10-03 15:35:46.461491
Or like this:                       12-10-03-15-35
Current year:                       2012
Month of year:                      October
Week number of the year:            40
Weekday of the week:                3
Day of year:                        277
Day of the month :                  03
Day of week:                        Wednesday

1 Stimmen

Damit wurde mein Problem gelöst, was mit den "mehr-abgestimmten-Antworten" nicht möglich war. Aber mein Problem war anders als das der OPs. Ich wollte, dass die Monate als Text gedruckt werden ("Februar" und nicht "2").

81voto

Ali Afshar Punkte 39615

Verwenden Sie date.strftime. Die Argumente für die Formatierung sind in der Dokumentation beschrieben .

Das hier ist das, was Sie wollten:

some_date.strftime('%Y-%m-%d')

Dieser berücksichtigt das Gebietsschema. (tun Sie dies)

some_date.strftime('%c')

49voto

Cees Timmerman Punkte 15076

Dies ist kürzer:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'

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