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!

Solihull
fonte

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.

Ryan
fonte
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'
mgilson
fonte
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'
Alex Martelli
fonte
@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.

newacct
fonte
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'
gdw2
fonte
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.
18

muito tarde para a festa, mas %-d funciona do meu lado.

datetime.now().strftime('%B %-d, %Y') produz algo como "5 de novembro de 2014"

Felicidades :)

bonbon.langes
fonte
1
duplicado da resposta principal? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringno meu sistema Windows.
Deqing
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')    
mcqwerty
fonte
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)
ptronico
fonte
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
4

basta usar replaceassim:

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

ele produzirá:

'2017/7/21'
Mohammad Hossein Shojaeinia
fonte
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().

Nathan Viboonchan
fonte
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)
Chris Chewa
fonte
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 .

Brandon Rhodes
fonte
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").

mmitchell
fonte
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

OliverRadini
fonte
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
user7503128
fonte
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