Strftime do Python - data sem levar 0?


277

Ao usar o Python strftime, existe uma maneira de remover o primeiro 0 da data, antes do dia 10, ou seja. tão01 é 1? Não consegue encontrar uma %coisa para isso?

Obrigado!

Respostas:


568

Na verdade, tive o mesmo problema e percebi que, se você adicionar um hífen entre %a letra e a letra, poderá remover o zero à esquerda.

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

Isso funciona apenas no Unix (Linux, OS X), não no Windows (incluindo Cygwin). No Windows, você usaria #, por exemplo %Y/%#m/%#d.


11
Nem sequer trabalho para mim, dá uma ValueError (Windows, Python 2.6)
rocketmonkeys

14
Funcionou para mim no OS X, mas estou usando o Python 2.7.2 do python.org.
precisa saber é o seguinte

13
@moose Eu fiz uma pergunta sobre isso :-) Aqui está a resposta -> stackoverflow.com/questions/28894172/…
Mathias

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

8
%#dfaria o mesmo no Windows
dalle 28/11

190

Podemos fazer esse tipo de coisa com o advento do formatmétodo desde python2.6:

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

Embora talvez esteja além do escopo da pergunta original, para formatos mais interessantes, você pode fazer coisas como:

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

E a partir do python3.6, isso pode ser expresso como uma string formatada em linha :

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
Muito agradável! Infelizmente, não funciona sozinho se você deseja usar representação textual como time.strftime('%A %B %d, %Y'), que produz (agora, no idioma inglês) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Algum motivo para eu não ter notado seu comentário até agora. Acontece que datetime especifica um __format__gancho muito interessante que permite escrever coisas assim.
mgilson

2
Um problema é que '{dt.hour}' usa um relógio de 24 horas :( Usando a segunda opção ainda traz para você voltar a usar. '{%#I}'No Windows e '{%-I}'no Unix.
ubomb

Bom ponto. Como nunca uso representações de relógio de 12 horas no código, não pensei nesse caso.
Mgilson # 24/16

Eu sugiro olhar para esta documentação adicional sobre a funcionalidade formato: pyformat.info
Mark

37

Algumas plataformas podem suportar especificação de largura e precisão entre %e a letra (como 'd' para o dia do mês), de acordo com http://docs.python.org/library/time.html - mas é definitivamente um dispositivo não portátil solução (por exemplo, não funciona no meu Mac ;-). Talvez você possa usar uma sequência de substituição (ou RE, para um formato realmente desagradável) após a strftimecorreção. por exemplo:

>>> 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 o que você quer dizer? Isso deve resultar em '1 de janeiro de 2000'
User

6
@ Usuário O código acima verifica se há um espaço em branco antes de 0 que, no caso de "01 de janeiro de 2000", não está presente.
Alagappan Ramu

@alex Exclua esta resposta, como você provavelmente sabe, está longe de ser uma resposta correta.
CONvid19 20/03

29

Aqui está a documentação dos modificadores suportados pelostrftime() biblioteca GNU C. (Como as pessoas disseram antes, pode não ser portátil.) De seu interesse, você pode ser:

  • %e ao invés de %d substituirá o zero inicial no dia do mês por um espaço

Funciona no meu Python (no Linux). Não sei se funcionará no seu.


3
% e falha para mim no Windows com Python 2.6. Eu estou supondo que é * nix específico. Pena :(
rocketmonkeys

1
Essa é a solução mais limpa e mais geral --- em um sistema * nix, pelo menos. Isso funciona no OS X.
BFTM

Como %-d acima , isso funciona no OS X 10.8.5 com Python 2.7.2, mas não no Windows 7 Pro de 64 bits com Python 2.7.3.
8263 Johan Johan

1
Isso funcionou para mim no Windows 7 SP1 com Python 3.5.1.
Neil Billingham

1
Isso introduziu um espaço extra em vez do zero à esquerda; portanto, se você estiver procurando por uma correspondência exata, talvez não seja isso. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 de maio de 23' >>> onze = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> onze.strftime ('% 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'

1
Isso funciona 01 de janeiro de 2000, Alexs não é obras.
guneysus

Qual o sentido de fazer .replace('X0','X').replace('X','')? Apenas faça .replace('X0', '')e será bom.
Marco Bonelli

2
@MarcoBonelli: Tente sua sugestão na string "X12 / X12 / 14" e você verá.
Gdw2

1
Isso é hack, mas é um hack pythonic.
27416 Josh M.



10

Acho que o filtro de formatação de data do modelo do Django é rápido e fácil. Ele remove zeros à esquerda. Se você não se importa de importar o módulo Django, confira.

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

Observe que se você é como eu e não está construindo seu aplicativo no django, precisará informar ao django que não precisa configurá-lo:import django.conf django.conf.settings.configure()
Alex Pretzlav

8

Veja -abaixo:

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

Funciona perfeitamente em python 3
Saurabh

Essa deve ser a resposta aceita. Faz o que é pedido, super simples e fácil de lembrar. Navegando rapidamente pelos documentos, não consegui encontrar essas informações.
Lucas Lima

1
"Esta deve ser a resposta aceita". Não, não deveria, pois isso só funciona no Linux.
user136036 28/03


3

Para %dvocê converter para inteiro usando int(), ele removerá automaticamente o 0 inicial e se tornará inteiro. Em seguida, você pode converter novamente em string usando str().


2
Pergunta OP foi para uma solução usando um especificador de formato em uma chamada para strftime, ao invés de uma solução envolvendo str roll-your-own ()
Dave Hooper

grande resposta, não ouvir Dave Hooper
Toskan

3

usando, por exemplo, "% -d" não é portátil, mesmo entre versões diferentes do mesmo sistema operacional. Uma solução melhor seria extrair os componentes da data individualmente e escolher entre operadores de formatação específicos para a data e acesso ao atributo de data para cada componente.

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

2

Como o Python realmente chama a strftime(3)função de linguagem C em sua plataforma, pode ser que haja caracteres de formato que você possa usar para controlar o zero inicial; experimentarman strftime dar uma olhada. Mas, é claro, o resultado não será portátil, como o manual do Python o lembrará. :-)

Em datetimevez disso, tentaria usar um objeto de novo estilo , que possui atributos como t.yeare t.monthe t.day, e colocá-los na formatação normal de alta potência do %operador, que suporta o controle dos zeros à esquerda. Veja http://docs.python.org/library/datetime.html para obter detalhes. Melhor ainda, use o "".format()operador se o seu Python o possuir e seja ainda mais moderno; também possui muitas opções de formato para números. Veja: http://docs.python.org/library/string.html#string-formatting .


2

Com base no método de Alex, isso funcionará para os casos de início de sequência e pós-espaços:

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

Gosto disso melhor do que .format ou% -d, porque é multiplataforma e me permite continuar usando o strftime (para obter coisas como "novembro" e "segunda-feira").


1

Pergunta antiga, mas% l (letra minúscula L) funcionou para mim no strftime: embora isso não funcione para todos, pois não está listado na documentação do Python que encontrei


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

Isto substitui o zero com um espaço, o que não é o que o OP pediu
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'usando python 3.5
ji-ruh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.