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.