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!

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.


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'

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'

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


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'

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.



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

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)

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().


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

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)

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 .


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


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


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.