Python strftime - Datum ohne führende 0?

277

Gibt es bei Verwendung von Python strftimeeine Möglichkeit, die erste 0 des Datums zu entfernen, wenn sie vor der 10. liegt, d. H. so 01ist 1? Kannst du kein %Ding dafür finden?

Vielen Dank!

Solihull
quelle

Antworten:

567

Eigentlich hatte ich das gleiche Problem und mir wurde klar, dass Sie %die führende Null entfernen können , wenn Sie einen Bindestrich zwischen dem und dem Buchstaben einfügen.

Zum Beispiel %Y/%-m/%-d.

Dies funktioniert nur unter Unix (Linux, OS X), nicht unter Windows (einschließlich Cygwin). Unter Windows würden Sie #z %Y/%#m/%#d.

Ryan
quelle
11
Funktioniert nicht einmal für mich, gibt einen ValueError (Windows, Python 2.6)
Rocketmonkeys
14
Es hat unter OS X für mich funktioniert, aber ich verwende Python 2.7.2 von python.org.
Tim Swast
13
@moose Ich habe eine Frage dazu gestellt :-) Hier ist die Antwort -> stackoverflow.com/questions/28894172/…
Mathias
10
Ich verstehe ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard
8
%#dwürde das gleiche unter Windows tun
dalle
190

Wir können so etwas mit dem Aufkommen der formatMethode seit Python2.6 tun:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

Obwohl dies möglicherweise den Rahmen der ursprünglichen Frage sprengt, können Sie für interessantere Formate Dinge tun wie:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

Ab Python3.6 kann dies als inline formatierte Zeichenfolge ausgedrückt werden :

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'
mgilson
quelle
2
Sehr schön! Funktioniert leider nicht alleine, wenn Sie eine Textdarstellung wie verwenden möchten time.strftime('%A %B %d, %Y'), die ergibt (jetzt im englischen Gebietsschema) Tuesday October 07, 2014.
Pekka Klärck
@ PekkaKlärck - Aus irgendeinem Grund hatte ich Ihren Kommentar bis jetzt nicht bemerkt. Es stellt sich heraus, dass datetime einen sehr interessanten __format__Hook angibt , mit dem Sie solche Dinge schreiben können.
mgilson
2
Ein Problem ist, dass '{dt.hour}'eine 24-Stunden-Uhr verwendet wird :(. Wenn Sie die zweite Option verwenden, können Sie immer noch unter '{%#I}'Windows und '{%-I}'Unix arbeiten.
ubomb
Guter Punkt. Ich verwende niemals 12-Stunden-Darstellungen im Code, daher habe ich nicht an diesen Fall gedacht.
mgilson
Ich würde vorschlagen, diese zusätzliche Dokumentation über die Formatfunktionalität zu lesen
Mark
37

Einige Plattformen unterstützen %laut http://docs.python.org/library/time.html möglicherweise die Angabe der Breite und Genauigkeit zwischen und dem Buchstaben (z. B. 'd' für den Tag des Monats) - aber es ist definitiv nicht portierbar Lösung (zB funktioniert nicht auf meinem Mac ;-). Vielleicht können Sie nach dem einen String-Ersatz (oder RE, für ein wirklich böses Format) verwenden, um das strftimezu beheben? z.B:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'
Alex Martelli
quelle
@guneysus was meinst du? Es sollte zu '1. Januar 2000'
Benutzer
6
@User Der obige Code sucht nach einem Leerzeichen vor 0, das im Fall von "01. Januar 2000" nicht vorhanden ist.
Alagappan Ramu
@alex Bitte löschen Sie diese Antwort, wie Sie wahrscheinlich wissen, es ist weit von einer richtigen Antwort entfernt.
CONvid19
29

Hier finden Sie die Dokumentation der Modifikatoren, die von strftime()der GNU C-Bibliothek unterstützt werden. (Wie die Leute bereits sagten, ist es möglicherweise nicht tragbar.) Für Sie könnte Folgendes von Interesse sein:

  • %eStattdessen %dwird die führende Null am Tag des Monats durch ein Leerzeichen ersetzt

Es funktioniert auf meinem Python (unter Linux). Ich weiß nicht, ob es bei Ihnen funktionieren wird.

newacct
quelle
3
% e schlägt für mich unter Windows mit Python 2.6 fehl. Ich vermute, es ist * nix-spezifisch. Schade :(
Rocketmonkeys
1
Dies ist die sauberste, allgemeinste Lösung - zumindest auf einem * nix-System. Dies funktioniert unter OS X.
BFTM
Wie %-d oben funktioniert dies unter OS X 10.8.5 mit Python 2.7.2, jedoch nicht unter Windows 7 Pro 64-Bit mit Python 2.7.3.
Johan
1
Dies funktionierte bei mir unter Windows 7 SP1 mit Python 3.5.1.
Neil Billingham
1
Dies führte ein zusätzliches Leerzeichen anstelle der führenden Null ein. Wenn Sie also nach einer genauen Übereinstimmung suchen, ist dies möglicherweise nicht der Fall. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') 'May 1 23' >>> elf = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> elf.strftime ('% b% e% H')
'11.
28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
gdw2
quelle
1
Dies funktioniert am 1. Januar 2000, Alexs funktioniert nicht.
Guneysos
Was ist der Sinn zu tun .replace('X0','X').replace('X','')? Tu es einfach .replace('X0', '')und es wird gut.
Marco Bonelli
2
@MarcoBonelli: Versuchen Sie Ihren Vorschlag auf der Zeichenfolge "X12 / X12 / 14" und Sie werden sehen.
GDW2
1
Dies ist ein Hack, aber es ist ein pythonischer Hack.
Josh M.
17

ziemlich spät zur Party, %-darbeitet aber an meinem Ende.

datetime.now().strftime('%B %-d, %Y')produziert so etwas wie "5. November 2014"

Prost :)

bonbon.langes
quelle
1
Duplikat der führenden Antwort? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringin meinem Windows-System.
Deqing
10

Ich finde den Datumsfilterfilter für Django-Vorlagen schnell und einfach. Führende Nullen werden entfernt. Wenn es Ihnen nichts ausmacht, das Django-Modul zu importieren, probieren Sie es aus.

http://docs.djangoproject.com/de/dev/ref/templates/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    
mcqwerty
quelle
Beachten Sie, dass Sie, wenn Sie wie ich sind und Ihre App nicht in Django erstellen, Django mitteilen müssen, dass Sie sie nicht konfigurieren müssen:import django.conf django.conf.settings.configure()
Alex Pretzlav
8

Schauen Sie sich -unten an:

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)
ptronico
quelle
Funktioniert perfekt in Python 3
Saurabh
Dies sollte die akzeptierte Antwort sein. Tut was gefragt wird, super einfach und leicht zu merken. Beim schnellen Durchsuchen der Dokumente konnte ich diese Informationen nicht finden.
Lucas Lima
1
"Dies sollte die akzeptierte Antwort sein". Nein, sollte es nicht, da dies nur unter Linux funktioniert.
user136036
3

Wenn %dSie mit in eine Ganzzahl konvertieren können, int()wird die führende 0 automatisch entfernt und eine Ganzzahl. Sie können dann mit zurück in einen String konvertieren str().

Nathan Viboonchan
quelle
2
OP Frage war für eine Lösung mit einem Formatbezeichner in einem Aufruf von strftime, anstatt eine Roll-Your-Own-Lösung mit str ()
Dave Hooper
Tolle Antwort, hör nicht auf Dave Hooper
Toskan
3

einfach so verwenden replace:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

es wird ausgegeben:

'2017/7/21'
Mohammad Hossein Shojaeinia
quelle
3

Die Verwendung von "% -d" ist beispielsweise auch zwischen verschiedenen Versionen desselben Betriebssystems nicht portierbar. Eine bessere Lösung wäre, die Datumskomponenten einzeln zu extrahieren und zwischen datumsspezifischen Formatierungsoperatoren und Datumsattributzugriff für jede Komponente zu wählen.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Chris Chewa
quelle
2

Da Python wirklich nur die C- strftime(3)Sprachfunktion auf Ihrer Plattform aufruft , gibt es möglicherweise Formatzeichen, mit denen Sie die führende Null steuern können. versuche man strftimees dir anzusehen. Aber natürlich ist das Ergebnis nicht portierbar, wie das Python-Handbuch Sie daran erinnern wird. :-)

Ich würde versuchen, stattdessen ein datetimeObjekt im neuen Stil zu verwenden, das Attribute wie t.yearund t.monthund hat t.day, und diese durch die normale, leistungsstarke Formatierung des %Operators zu setzen, die die Steuerung führender Nullen unterstützt. Weitere Informationen finden Sie unter http://docs.python.org/library/datetime.html . Besser noch, verwenden Sie den "".format()Operator, wenn Ihr Python ihn hat, und seien Sie noch moderner. Es gibt auch viele Formatoptionen für Zahlen. Siehe: http://docs.python.org/library/string.html#string-formatting .

Brandon Rhodes
quelle
2

Basierend auf Alex 'Methode funktioniert dies sowohl für den Fall des String-Starts als auch für den Fall nach dem Leerzeichen:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

Ich mag das besser als .format oder% -d, weil dies plattformübergreifend ist und es mir ermöglicht, strftime weiter zu verwenden (um Dinge wie "November" und "Montag" zu erhalten).

mmitchell
quelle
1

Alte Frage, aber% l (Kleinbuchstabe L) hat in der Zwischenzeit für mich funktioniert: Dies funktioniert jedoch möglicherweise nicht für alle, da es nicht in der Python-Dokumentation aufgeführt ist, die ich gefunden habe

OliverRadini
quelle
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
user7503128
quelle
Dies ersetzt die führende Null durch ein Leerzeichen, was das OP nicht verlangt hat
Dave Hooper,
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'mit Python 3.5
ji-ruh