Wie drucke ich ein Datum in einem regulären Format?

682

Das ist mein Code:

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

Dies druckt: 2008-11-22was genau das ist, was ich will.

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

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

Dies druckt Folgendes:

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

Wie kann ich nur ein einfaches Date bekommen 2008-11-22?

NomadAlien
quelle
13
Die kurze Antwort: Durch Anwenden str()(auf jedes Element der Liste), denn genau das hat printimplizit mit Ihrem Solo- todayObjekt geschehen.
Lutz Prechelt

Antworten:

947

Das WARUM: Daten sind Objekte

In Python sind Datumsangaben Objekte. Wenn Sie sie manipulieren, manipulieren Sie daher Objekte, keine Zeichenfolgen, keine Zeitstempel oder irgendetwas.

Jedes Objekt in Python hat ZWEI Zeichenfolgendarstellungen:

  • Die reguläre Darstellung, die von "print" verwendet wird, kann mit der str()Funktion abgerufen werden . Es ist meistens das am häufigsten lesbare Format und wird verwendet, um die Anzeige zu vereinfachen. So str(datetime.datetime(2008, 11, 22, 19, 53, 42))gibt es dir '2008-11-22 19:53:42'.

  • Die alternative Darstellung, die zur Darstellung der Objektnatur (als Daten) verwendet wird. Es kann mithilfe der repr()Funktion verwendet werden und ist praktisch, um zu wissen, welche Art von Daten Sie während der Entwicklung oder des Debuggens bearbeiten. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))gibt dir 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Was passiert ist, ist, dass wenn Sie das Datum mit "Drucken" gedruckt haben, es verwendet wurde, str()damit Sie eine schöne Datumszeichenfolge sehen konnten. Wenn Sie jedoch gedruckt haben mylist, haben Sie eine Liste von Objekten gedruckt , und Python hat versucht, den Datensatz mithilfe von darzustellen repr().

Das Wie: Was willst du damit machen?

Wenn Sie Datumsangaben bearbeiten, verwenden Sie die Datumsobjekte weiterhin. Sie haben Tausende nützlicher Methoden und die meisten Python-APIs erwarten, dass Daten Objekte sind.

Wenn Sie sie anzeigen möchten, verwenden Sie einfach str(). In Python empfiehlt es sich, alles explizit zu übertragen. Wenn es also Zeit zum Drucken ist, erhalten Sie eine Zeichenfolgendarstellung Ihres Datums mit str(date).

Eine letzte Sache. Beim Versuch, die Daten zu drucken, haben Sie gedruckt mylist. Wenn Sie ein Datum drucken möchten, müssen Sie die Datumsobjekte drucken, nicht ihren Container (die Liste).

ZB möchten Sie das gesamte Datum in einer Liste drucken:

for date in mylist :
    print str(date)

Beachten Sie, dass Sie in diesem speziellen Fall sogar weglassen können, str()da der Druck dies für Sie verwendet. Aber es sollte keine Gewohnheit werden :-)

Praktischer Fall mit Ihrem Code

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

Daten haben eine Standarddarstellung, aber Sie können sie in einem bestimmten Format drucken. In diesem Fall können Sie mithilfe der strftime()Methode eine benutzerdefinierte Zeichenfolgendarstellung abrufen.

strftime() erwartet ein Zeichenfolgenmuster, das erklärt, wie Sie Ihr Datum formatieren möchten.

Z.B :

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

Alle Buchstaben nach a "%"stellen ein Format für etwas dar:

  • %d ist die Tagesnummer
  • %m ist die Monatszahl
  • %b ist die Monatsabkürzung
  • %y ist das Jahr der letzten zwei Ziffern
  • %Y ist das ganze Jahr

usw

Werfen Sie einen Blick auf die offizielle Dokumentation oder McCutchens Kurzreferenz, Sie können nicht alle kennen.

Seit PEP3101 kann jedes Objekt ein eigenes Format haben, das automatisch vom Methodenformat einer beliebigen Zeichenfolge verwendet wird. Im Fall von datetime ist das Format dasselbe, das in strftime verwendet wird. So können Sie das Gleiche wie oben tun:

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

Der Vorteil dieses Formulars besteht darin, dass Sie gleichzeitig auch andere Objekte konvertieren können.
Mit der Einführung formatierter Zeichenfolgenliterale (seit Python 3.6, 23.12.2016) kann dies wie folgt geschrieben werden

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

Lokalisierung

Daten können sich automatisch an die Landessprache und -kultur anpassen, wenn Sie sie richtig verwenden, aber es ist etwas kompliziert. Vielleicht für eine andere Frage zu SO (Stack Overflow) ;-)

E-Satis
quelle
3
Übrigens Fast jeder Datentyp in Python ist eine Klasse (außer unveränderlichen, aber sie können in Unterklassen unterteilt werden) stackoverflow.com/questions/865911/…
Yauhen Yakimovich
1
Was meinst du mit "fast"? str und int haben ein Klassenattribut , das 'type' enthält, daher gibt es selbst eine Klasse, da es sich um Instanzen der Typmetaklasse handelt.
E-Satis
4
Dies ist genau die Frage der Terminologie: Typ! = Klasse?, Dh es reicht aus, ein Typattribut zu haben (einen Typinferenzmechanismus bereitzustellen, um für ein Objekt qualifiziert zu werden) oder sollte sich eine Entität als Objekt verhalten. Ich versuche dies hier für mich selbst zu lösen programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich
1
Wenn Sie eine Instanz einer Klasse sind, sind Sie ein Objekt. Warum sollte es komplizierter sein?
E-
9
Jeder Wert in Python ist ein Objekt. Jedes Objekt hat einen Typ. "Typ" == "Klasse" formal (siehe inspect.isclassauch um sicher zu gehen). Die Leute neigen dazu, "Typ" für Einbauten und "Klasse" für den Rest zu sagen, aber das ist nicht wichtig
Kos
340
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Bearbeiten:

Nach dem Vorschlag von Cees habe ich auch angefangen, Zeit zu nutzen:

import time
print time.strftime("%Y-%m-%d %H:%M")
Daniel Magnusson
quelle
6
datetime.datetime?
Cees Timmerman
2
Sie können von datetime import datetimeund dann verwenden print datetime().now().strftime("%Y-%m-%d %H:%M"). Nur ein Syntaxunterschied.
Daniel Magnusson
7
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 denke, das Datum / Uhrzeit-Modul ist für Datumsmathematik.
Cees Timmerman
2
Mein Favorit ist from datetime import datetime as dtund jetzt können wir mitdt.now()
Diewland
164

Die Objekte für Datum, Uhrzeit und Uhrzeit unterstützen alle eine strftime-Methode (Format), um eine Zeichenfolge zu erstellen, die die Zeit unter der Kontrolle einer expliziten Formatzeichenfolge darstellt.

Hier ist eine Liste der Formatcodes mit ihrer Direktive und Bedeutung.

    %a  Locales abbreviated weekday name.
    %A  Locales full weekday name.      
    %b  Locales abbreviated month name.     
    %B  Locales full month name.
    %c  Locales 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  Locales 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  Locales appropriate date representation.    
    %X  Locales 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.

Dies können wir mit den Datums- und Zeitmodulen 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")

Das wird ungefähr so ​​ausdrucken:

    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
Transformator
quelle
1
Dies löste mein Problem, bei dem die "besser bewerteten Antworten" dies nicht taten. Aber mein Problem war anders als bei den OPs. Ich wollte Monate als Text drucken ("Februar" statt "2")
Nathan
73

Verwenden Sie date.strftime. Die Formatierungsargumente sind in der Dokumentation beschrieben .

Dieser ist, was Sie wollten:

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

Dieser berücksichtigt das Gebietsschema. (mach das)

some_date.strftime('%c')
Ali Afshar
quelle
36

Das ist kürzer:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
Cees Timmerman
quelle
26
# convert date time to regular format.

d_date = datetime.datetime.now()
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

AUSGABE

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34
Waqas Ali
quelle
25

Oder auch

from datetime import datetime, date

"{:%d.%m.%Y}".format(datetime.now())

Out: '25 .12.2013

oder

"{} - {:%d.%m.%Y}".format("Today", datetime.now())

Out: 'Heute - 25.12.2013'

"{:%A}".format(date.today())

Out: 'Mittwoch'

'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())

Out: '__main ____ 2014.06.09__16-56.log'

b1_
quelle
14

Einfache Antwort -

datetime.date.today().isoformat()
Flamme von Udun
quelle
8

Mit typspezifischer datetimeZeichenfolgenformatierung (siehe Antwort von nk9 mit str.format().) In einem formatierten Zeichenfolgenliteral (seit Python 3.6, 23.12.2016):

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

Die Datums- / Uhrzeitformat - Richtlinien werden nicht als Teil der dokumentierten Format String Syntax , sondern in date, datetimeund time‚s - strftime()Dokumentation. Sie basieren auf dem C-Standard von 1989, enthalten jedoch einige ISO 8601-Richtlinien seit Python 3.6.

Griff
quelle
Beachten Sie, dass ich diese Informationen auch zur akzeptierten Antwort hinzugefügt habe .
behandeln
strftime enthält nicht wirklich eine "ISO 8601-Ausgabe". Es gibt "Direktiven", aber nur für bestimmte Token wie "Wochentag", nicht einen ganzen ISO 8601-Zeitstempel, was ich immer als störend empfunden habe.
Anarcat
5

Sie müssen das Datums- / Uhrzeitobjekt in eine Zeichenfolge konvertieren.

Der folgende Code hat bei mir funktioniert:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen.

Simon Johnson
quelle
3
Komm schon ! Ermutigen Sie einen Neuling nicht, eine Zeichenfolge anstelle eines Datumsobjekts zu speichern. Er wird nicht wissen können, wann es eine gute oder eine schlechte Idee ist ...
e-satis
e-satis: Wenn Sie nur eine Zeichenfolge benötigen, was ist die große Sache? Wir speichern unsere Firmware-Erstellungsdaten ständig als Zeichenfolgen - manchmal ist das Speichern eines ganzen Objekts übertrieben, wenn Sie nur einen einfachen Zeitstempel benötigen (YAGNI und alle).
HanClinto
3
Ja, in bestimmten Fällen ist es. Ich meine nur, dass nur ein Neuling diese Fälle nicht identifizieren kann. Fangen wir also mit dem rechten Fuß an :-)
e-satis
3

Du kannst tun:

mylist.append(str(today))
Igal Serban
quelle
3

Ich hasse die Idee, zu viele Module zu importieren. Ich würde lieber mit verfügbaren Modulen arbeiten, was in diesem Fall datetimeeher ist, als ein neues Modul aufzurufen time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
Rickydj
quelle
1
Ich denke, es wäre effizienter, dies in einer Codezeile zu tuna = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore
3

In Anbetracht der Tatsache, dass Sie um etwas Einfaches gebeten haben, um das zu tun, was Sie wollten, könnten Sie einfach:

import datetime
str(datetime.date.today())
Ward Taya
quelle
3

Verwenden Sie für diejenigen, die ein auf dem Gebietsschema basierendes Datum und ohne Uhrzeit wünschen:

>>> some_date.strftime('%x')
07/11/2019
Liran H.
quelle
2

Vielleicht möchten Sie es als Zeichenfolge anhängen?

import datetime 
mylist = [] 
today = str(datetime.date.today())
mylist.append(today) 
print mylist
HanClinto
quelle
2

Da das print todayzurückgegeben wird, was Sie möchten, bedeutet dies, dass die __str__Funktion des heutigen Objekts die gesuchte Zeichenfolge zurückgibt.

So können Sie auch tun mylist.append(today.__str__()).

Ismail Elouafiq
quelle
1

Sie können easy_date verwenden , um es einfach zu machen:

import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
Raphael Amoedo
quelle
1

Ein kurzer Haftungsausschluss für meine Antwort: Ich lerne Python erst seit ungefähr 2 Wochen, bin also kein Experte. Daher ist meine Erklärung möglicherweise nicht die beste und ich verwende möglicherweise eine falsche Terminologie. Wie auch immer, hier geht es.

Ich habe in Ihrem Code festgestellt, dass Sie Ihre Variable deklariert haben today = datetime.date.today() Ihre Variable mit dem Namen einer integrierten Funktion benannt haben.

Wenn Ihre nächste Codezeile mylist.append(today)Ihre Liste anfügt, wird die gesamte Zeichenfolge angehängt datetime.date.today(), die Sie zuvor als Wert für Ihre todayVariable festgelegt haben, anstatt nur anzuhängentoday() .

Eine einfache Lösung, die die meisten Codierer bei der Arbeit mit dem datetime-Modul möglicherweise nicht verwenden würden, besteht darin, den Namen Ihrer Variablen zu ändern.

Folgendes habe ich versucht:

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

und es druckt yyyy-mm-dd.

Mark S.
quelle
1

So zeigen Sie das Datum als (Jahr / Monat / Tag) an:

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)
Adrian Simon
quelle
1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

Dies wird am 23.06.2008 gedruckt, wenn Sie dies möchten :)

Erix
quelle
-1
import datetime
import time

months = ["Unknown","January","Febuary","Marchh","April","May","June","July","August","September","October","November","December"]
datetimeWrite = (time.strftime("%d-%m-%Y "))
date = time.strftime("%d")
month= time.strftime("%m")
choices = {'01': 'Jan', '02':'Feb','03':'Mar','04':'Apr','05':'May','06': 'Jun','07':'Jul','08':'Aug','09':'Sep','10':'Oct','11':'Nov','12':'Dec'}
result = choices.get(month, 'default')
year = time.strftime("%Y")
Date = date+"-"+result+"-"+year
print Date

Auf diese Weise können Sie das Datum wie folgt formatieren lassen: 22.06.2017

Tanmayee
quelle
1
Zu viel Code für etwas, das Sie in einer Zeile erhalten könnten. Mit erhalten %bSie die ersten drei Monatswörter und mit %Bdem gesamten Monat. Beispiel: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")wird '2018-Oct-04 09:44:08' zurückgeben
Víctor López
-1

Ich verstehe nicht ganz, kann aber verwenden pandas, um Zeiten im richtigen Format zu erhalten:

>>> import pandas as pd
>>> pd.to_datetime('now')
Timestamp('2018-10-07 06:03:30')
>>> print(pd.to_datetime('now'))
2018-10-07 06:03:47
>>> pd.to_datetime('now').date()
datetime.date(2018, 10, 7)
>>> print(pd.to_datetime('now').date())
2018-10-07
>>> 

Und:

>>> l=[]
>>> l.append(pd.to_datetime('now').date())
>>> l
[datetime.date(2018, 10, 7)]
>>> map(str,l)
<map object at 0x0000005F67CCDF98>
>>> list(map(str,l))
['2018-10-07']

Aber es speichert Zeichenfolgen, ist aber einfach zu konvertieren:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
U10-Vorwärts
quelle
4
Eine ganze Abhängigkeit, um etwas zu tun Python Python-Bibliothek hat Methoden zu tun?
Hejazzman