Python strftime: ¿fecha sin 0 a la izquierda?

277

Cuando se usa Python strftime, ¿hay alguna forma de eliminar el primer 0 de la fecha si es anterior al 10, es decir? asi 01es 1? ¿No puedes encontrar una %cosita para eso?

¡Gracias!

Solihull
fuente

Respuestas:

568

En realidad, tuve el mismo problema y me di cuenta de que, si agrega un guión entre %la letra y la letra, puede eliminar el cero inicial.

Por ejemplo %Y/%-m/%-d.

Esto solo funciona en Unix (Linux, OS X), no en Windows (incluido Cygwin). En Windows, usaría #, por ejemplo %Y/%#m/%#d.

Ryan
fuente
11
Ni siquiera funciona para mí, da un ValueError (windows, python 2.6)
rocketmonkeys
14
Funcionó para mí en OS X, pero estoy usando Python 2.7.2 de python.org.
Tim Swast
13
@moose Hice una pregunta sobre esto :-) aquí está la respuesta -> stackoverflow.com/questions/28894172/…
Mathias
10
Consigo ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard
8
%#dharía lo mismo en Windows
dalle
190

Podemos hacer este tipo de cosas con el advenimiento del formatmétodo desde python2.6:

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

Aunque quizás esté más allá del alcance de la pregunta original, para formatos más interesantes, puede hacer cosas como:

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

Y a partir de python3.6, esto se puede expresar como una cadena formateada en línea :

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
fuente
2
¡Muy agradable! Desafortunadamente, no funciona solo si desea utilizar una representación textual como time.strftime('%A %B %d, %Y'), lo que produce (ahora, en inglés) Tuesday October 07, 2014.
Pekka Klärck
@ PekkaKlärck - Por alguna razón no había notado tu comentario hasta ahora. Resulta que datetime especifica un __format__gancho muy interesante que te permite escribir cosas así.
mgilson
2
Un problema es que '{dt.hour}'usa un reloj de 24 horas :(. El uso de la segunda opción todavía lo lleva de nuevo a usar '{%#I}'en Windows y '{%-I}'en Unix.
ubomb
Buen punto. Nunca uso representaciones de reloj de 12 horas en el código, así que no pensé en ese caso.
mgilson
Sugeriría mirar esta documentación adicional sobre la funcionalidad del formato: pyformat.info
Mark
37

Algunas plataformas pueden admitir especificaciones de ancho y precisión entre %y la letra (como 'd' para el día del mes), de acuerdo con http://docs.python.org/library/time.html , pero definitivamente no es portátil solución (por ejemplo, no funciona en mi Mac ;-). ¿Tal vez pueda usar un reemplazo de cadena (o RE, para un formato realmente desagradable) después de la strftimesolución? p.ej:

>>> 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
fuente
@guneysus, ¿qué quieres decir? Debería resultar en '1 de enero de 2000'
Usuario
66
@Usuario El código anterior busca un espacio en blanco antes de 0 que en el caso del "01 de enero de 2000" no está presente.
Alagappan Ramu
@alex Elimine esta respuesta, como probablemente sepa, está lejos de ser una respuesta correcta.
CONvid19
29

Aquí está la documentación de los modificadores compatibles con strftime()la biblioteca GNU C. (Como la gente dijo antes, puede que no sea portátil). De interés para usted podría ser:

  • %een lugar de %dreemplazará el cero inicial en el día del mes con un espacio

Funciona en mi Python (en Linux). No sé si funcionará en el tuyo.

newacct
fuente
3
% e falla para mí en Windows con Python 2.6. Supongo que es * nix específico. Lástima :(
rocketmonkeys
1
Esta es la solución más limpia y más general --- en un sistema * nix, al menos. Esto funciona en OS X.
BFTM
Al igual que lo %-d anterior , esto funciona en OS X 10.8.5 con Python 2.7.2, pero no en Windows 7 Pro de 64 bits con Python 2.7.3.
Johan
1
Esto funcionó para mí en Windows 7 SP1 con Python 3.5.1.
Neil Billingham
1
Esto introdujo un espacio adicional en lugar del cero inicial, por lo que si está buscando una coincidencia exacta, puede que no sea así. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 de mayo 23' >>> once = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> once.trtrime ('% b% e% H')
'11 de
28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
gdw2
fuente
1
Esto funciona el 1 de enero de 2000, Alexs no funciona.
Guneysus
¿Qué sentido tiene hacer .replace('X0','X').replace('X','')? Solo hazlo .replace('X0', '')y será bueno.
Marco Bonelli
2
@MarcoBonelli: Pruebe su sugerencia en la cadena "X12 / X12 / 14" y verá.
gdw2
1
Este es un hack, pero es un hack pitónico.
Josh M.
18

bastante tarde para la fiesta pero %-dfunciona de mi parte.

datetime.now().strftime('%B %-d, %Y')produce algo así como "5 de noviembre de 2014"

salud :)

bonbon.langes
fuente
1
duplicado de la respuesta principal? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringen mi sistema de Windows
Deqing
10

Encuentro que el filtro de formato de fecha de plantilla de Django es rápido y fácil. Elimina los ceros a la izquierda. Si no te importa importar el módulo Django, échale un vistazo.

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')    
mcqwerty
fuente
Tenga en cuenta que si es como yo y no está creando su aplicación en django, deberá decirle a django que no necesita configurarla:import django.conf django.conf.settings.configure()
Alex Pretzlav
8

Echa un vistazo a -continuación:

>>> 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
fuente
Funciona perfectamente en Python 3
Saurabh
Esta debería ser la respuesta aceptada. Hace lo que se le pide, super simple y fácil de recordar. Navegando rápidamente por los documentos no pude encontrar esta información.
Lucas Lima
1
"Esta debería ser la respuesta aceptada". No, no debería, ya que esto solo funciona en Linux.
user136036
4

simplemente use replaceasí:

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

saldrá:

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

Para %dque pueda convertir a entero usando int(), eliminará automáticamente el 0 inicial y se convertirá en entero. Luego puede volver a convertir a cadena usando str().

Nathan Viboonchan
fuente
2
La pregunta de OP era para una solución que utiliza un especificador de formato en una llamada al tiempo de ejecución, en lugar de una solución roll-your-own que involucra str ()
Dave Hooper
gran respuesta, no escuches a Dave
Hooper
3

utilizando, por ejemplo, "% -d" no es portátil, incluso entre diferentes versiones del mismo sistema operativo. Una mejor solución sería extraer los componentes de fecha individualmente y elegir entre operadores de formato específicos de fecha y acceso a atributos de fecha para cada componente.

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

Debido a que Python realmente solo llama a la strftime(3)función del lenguaje C en su plataforma, puede ser que haya caracteres de formato que podría usar para controlar el cero inicial; tratarman strftime echar un vistazo. Pero, por supuesto, el resultado no será portátil, como le recordará el manual de Python. :-)

Intentaría usar un datetimeobjeto de estilo nuevo en su lugar, que tiene atributos como t.yeary t.monthy t.day, y los sometería al formato normal y de alta potencia del %operador, que admite el control de los ceros a la izquierda. Consulte http://docs.python.org/library/datetime.html para más detalles. Mejor aún, use el "".format()operador si su Python lo tiene y sea aún más moderno; También tiene muchas opciones de formato para números. Ver: http://docs.python.org/library/string.html#string-formatting .

Brandon Rhodes
fuente
2

Basado en el método de Alex, esto funcionará tanto para los casos de inicio de cadena como después de espacios:

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

Me gusta más que .format o% -d porque es multiplataforma y me permite seguir usando strftime (para obtener cosas como "noviembre" y "lunes").

mmitchell
fuente
1

Pregunta anterior, pero% l (L minúscula) funcionó para mí en el tiempo de ejecución: sin embargo, esto puede no funcionar para todos, ya que no aparece en la documentación de Python que encontré

OliverRadini
fuente
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
usuario7503128
fuente
Esto reemplaza el cero inicial con un espacio, que no es lo que solicitó el OP
Dave Hooper,
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'usando Python 3.5
ji-Ruh