Python strftime - date sans début 0?


277

Lors de l'utilisation de Python strftime, existe-t-il un moyen de supprimer le premier 0 de la date si c'est avant le 10, c'est-à-dire. il en 01est de même 1? Vous ne trouvez pas quelque %chose pour ça?

Merci!

Réponses:


568

En fait, j'ai eu le même problème et j'ai réalisé que si vous ajoutez un trait d'union entre la %et la lettre, vous pouvez supprimer le zéro de tête.

Par exemple %Y/%-m/%-d.

Cela ne fonctionne que sous Unix (Linux, OS X), pas Windows (y compris Cygwin). Sous Windows, vous utiliseriez #, par exemple %Y/%#m/%#d.


11
Ne fonctionne même pas pour moi, donne une ValueError (windows, python 2.6)
rocketmonkeys

14
Cela a fonctionné pour moi sur OS X, mais j'utilise le Python 2.7.2 de python.org.
Tim Swast

13
@moose J'ai posé une question à ce sujet :-) voici la réponse -> stackoverflow.com/questions/28894172/…
Mathias

10
Je comprends ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard

8
%#dferait la même chose sur Windows
dalle

190

Nous pouvons faire ce genre de chose avec l'avènement de la formatméthode depuis python2.6:

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

Bien que cela dépasse peut-être la portée de la question d'origine, pour des formats plus intéressants, vous pouvez faire des choses comme:

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

Et à partir de python3.6, cela peut être exprimé comme une chaîne formatée en ligne :

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
Très agréable! Malheureusement, ne fonctionne pas seul si vous souhaitez utiliser une représentation textuelle comme celle time.strftime('%A %B %d, %Y')qui donne (maintenant, en anglais) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Une raison pour laquelle je n'avais pas remarqué votre commentaire jusqu'à présent. Il s'avère que datetime spécifie un __format__hook très intéressant qui vous permet d'écrire des choses comme ça.
mgilson

2
Un problème est qu'il '{dt.hour}'utilise une horloge de 24 heures :(. L'utilisation de la deuxième option vous ramène toujours à l'utilisation '{%#I}'sur Windows et '{%-I}'sur Unix.
ubomb

Bon point. Je n'utilise jamais de représentations d'horloge de 12 heures dans le code, donc je n'ai pas pensé à ce cas.
mgilson

Je suggère de consulter
Mark

37

Certaines plates-formes peuvent prendre en charge la spécification de largeur et de précision entre %et la lettre (comme «d» pour le jour du mois), selon http://docs.python.org/library/time.html - mais c'est certainement un non portable (par exemple ne fonctionne pas sur mon Mac ;-). Peut-être pouvez-vous utiliser un remplacement de chaîne (ou RE, pour un format vraiment désagréable) après strftimepour y remédier? par exemple:

>>> 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 que voulez-vous dire? Il devrait en résulter «1er janvier 2000»
Utilisateur

6
@User Le code ci-dessus recherche un espace vide avant 0 qui, en cas de "01 janvier 2000" n'est pas présent.
Alagappan Ramu

@alex Veuillez supprimer cette réponse, comme vous le savez probablement, c'est loin d'être une bonne réponse.
CONvid19

29

Voici la documentation des modificateurs supportés par strftime()dans la bibliothèque GNU C. (Comme les gens l'ont dit auparavant, il pourrait ne pas être portable.) Vous pourriez être intéressé par:

  • %eau lieu de %dremplacera le zéro devant le jour du mois par un espace

Cela fonctionne sur mon Python (sous Linux). Je ne sais pas si cela fonctionnera sur le vôtre.


3
% e échoue pour moi sous Windows avec Python 2.6. Je suppose que c'est * nix spécifique. Dommage :(
rocketmonkeys

1
C'est la solution la plus propre et la plus générale --- sur un système * nix, au moins. Cela fonctionne sur OS X.
BFTM

Comme %-d ci - dessus , cela fonctionne sous OS X 10.8.5 avec Python 2.7.2, mais pas sous Windows 7 Pro 64 bits avec Python 2.7.3.
Johan

1
Cela a fonctionné pour moi sur Windows 7 SP1 avec Python 3.5.1.
Neil Billingham

1
Cela a introduit un espace supplémentaire au lieu du zéro de tête, donc si vous recherchez une correspondance exacte, ce n'est peut-être pas le cas. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 23 mai' >>> eleven = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> onze.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
Cela fonctionne le 1er janvier 2000, Alexs ne fonctionne pas.
guneysus

À quoi ça sert .replace('X0','X').replace('X','')? Faites-le .replace('X0', '')et ce sera bien.
Marco Bonelli

2
@MarcoBonelli: Essayez votre suggestion sur la chaîne "X12 / X12 / 14" et vous verrez.
gdw2

1
C'est du hack, mais c'est un hack pythonique.
Josh M.



10

Je trouve que le filtre de formatage de la date du modèle Django est rapide et facile. Il supprime les zéros non significatifs. Si cela ne vous dérange pas d'importer le module Django, vérifiez-le.

http://docs.djangoproject.com/en/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')    

Notez que si vous êtes comme moi et que vous ne construisez pas votre application dans django, vous devrez dire à django que vous n'avez pas besoin de le configurer:import django.conf django.conf.settings.configure()
Alex Pretzlav

8

Jetez un œil au -soufflet:

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

Fonctionne parfaitement en python 3
Saurabh

Ce devrait être la réponse acceptée. Fait ce qui est demandé, super simple et facile à retenir. En parcourant rapidement les documents, je n'ai pas pu trouver ces informations.
Lucas Lima

1
"Cela devrait être la réponse acceptée". Non, cela ne devrait pas, car cela ne fonctionne que sur Linux.
user136036


3

Car %dvous pouvez convertir en entier en utilisant int()alors il supprimera automatiquement le 0 en tête et deviendra entier. Vous pouvez ensuite reconvertir en chaîne à l'aide de str().


2
La question OP était pour une solution utilisant un spécificateur de format dans un appel à strftime, plutôt qu'une solution roll-your-own impliquant str ()
Dave Hooper

bonne réponse, n'écoutez pas Dave Hooper
Toskan

3

utiliser, par exemple, "% -d" n'est pas portable même entre différentes versions du même système d'exploitation. Une meilleure solution serait d'extraire les composants de date individuellement et de choisir entre les opérateurs de formatage spécifiques à la date et l'accès aux attributs de date pour chaque composant.

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

2

Parce que Python appelle vraiment la strftime(3)fonction de langage C sur votre plate-forme, il se peut qu'il y ait des caractères de format que vous pouvez utiliser pour contrôler le zéro de tête; essayez de man strftimejeter un oeil. Mais, bien sûr, le résultat ne sera pas portable, comme le manuel Python vous le rappellera. :-)

J'essaierais d'utiliser un datetimeobjet de nouveau style à la place, qui a des attributs comme t.yearet t.monthet t.day, et de les soumettre au formatage normal et puissant de l' %opérateur, qui prend en charge le contrôle des zéros non significatifs. Voir http://docs.python.org/library/datetime.html pour plus de détails. Mieux encore, utilisez l' "".format()opérateur si votre Python l'a et soyez encore plus moderne; il dispose également de nombreuses options de format pour les nombres. Voir: http://docs.python.org/library/string.html#string-formatting .


2

Basé sur la méthode d'Alex, cela fonctionnera à la fois pour les cas de début de chaîne et d'après-espaces:

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

J'aime mieux cela que .format ou% -d parce que c'est multiplateforme et me permet de continuer à utiliser strftime (pour obtenir des choses comme "novembre" et "lundi").


1

Vieille question, mais% l (minuscule L) a fonctionné pour moi en strftime: cela peut ne pas fonctionner pour tout le monde, car il n'est pas répertorié dans la documentation Python que j'ai trouvée


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

Cela remplace le zéro de tête par un espace, ce qui n'est pas ce que le PO a demandé
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'en utilisant python 3.5
ji-ruh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.