Formatação de data e hora Python sem preenchimento de zero

90

Existe um formato para imprimir datetimes Python que não usará preenchimento de zero em datas e horas?

Formato que estou usando agora:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

Resultado: 2012/02/29 05:03
desejado: 2012/02/29 05:03

Qual formato representaria o mês como '2' em vez de '02' e a hora como '17h03' em vez de '05h15'

Yarin
fonte

Respostas:

77

Todas as opções de formatação disponíveis com datetime.strftime()zeros. Você pode, é claro, rolar sua própria função de formatação, mas a solução mais fácil neste caso pode ser pós-processar o resultado de datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Sven Marnach
fonte
1
Sven- Porque eu quero me parecer com o Facebook. Obrigado!
Yarin
4
Muito poucas pessoas usam horas preenchidas com zero na América do Norte ao escrever as horas à mão.
Eric Walker
2
Isso ainda não vai marcar o dia do mês com zeros?
Juiz Maygarden
1
@JudgeMaygarden: É por isso que a solução serve .lstrip("0")para se livrar do zero à esquerda.
Sven Marnach
1
Por que eu quero remover os zeros do pad? Porque isso está errado com o RFC 2822 , por exemplo, no feed de podcast.
Vitaly Zdanevich
172

A outra alternativa para evitar o aspecto de zero à esquerda "tudo ou nada" acima é colocar um sinal de menos na frente do tipo de campo:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

Então este: '4/10/2015 03:00 AM'

Torna-se: '10/04/2015 3:00 AM'

Você pode opcionalmente colocar um sinal de menos na frente do dia, se desejar.

Editar: O recurso menos deriva da biblioteca GNU C (“glibc”), conforme mencionado na página de manual do Linux strftime em “Notas Glibc”

ChrisFreeman
fonte
50
Ótima resposta, mas apenas Linux. Não funciona no Windows. stackoverflow.com/questions/10807164/…
ExactaBox
1
Por que isso funciona? Não consigo encontrar uma referência a isso nos documentos de date.__format__ou time.strftime, docs.python.org/3/library/… e docs.python.org/3.8/library/time.html#time.strftime respectivamente
Amin Shah Gilani
95

O novo sistema de formatação de strings oferece uma alternativa para strftime. É bastante legível - na verdade, pode ser preferível strftimepor conta disso. Sem mencionar o fato de que não zera:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

Como você provavelmente deseja preenchimento zero no campo minuto, pode fazer o seguinte:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

Se você quiser o tempo "regular" em vez do tempo "militar", também poderá usar os strftimeespecificadores padrão . Convenientemente, para os nossos propósitos, strftime não fornecer um código para o acolchoado de 12 horas com um espaço em branco em vez de um zero à esquerda:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

Isso se torna um pouco menos legível, infelizmente. E, como @mlissner aponta, strftimefalhará em algumas (todas?) Plataformas para datas anteriores a 1900.

remetente
fonte
1
Ele existe desde o python 2.6. (Não é que nova.)
senderle
3
Para soletrar o mês, por exemplo, você pode usar o seguinte: "{0.day} {0:%B %Y}".format(d)que daria a você '2 August 2013'o dia deste comentário :)
Jens
2
Isso é interessante, mas na verdade não responde OP, porque ele quer horas AM / PM. Na verdade, não vou negar, mas a resposta aceita está certa se você está tentando obter a formatação de data / hora "americana" em python.
Dana Cartwright
Observe que essa técnica usa strftime, que falhará em datas anteriores a 1900. Se você tiver datas antigas, se arrependerá.
mlissner
1
fak! Acabei de perceber onde não apontei para outro objeto, apenas o passei como um argumento posicional.
JacobIRR
54

A resposta aceita não é uma solução adequada (IMHO) Os métodos documentados adequados:

No Linux, "#" é substituído por "-":

% -d,% -H,% -I,% -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

No Windows, "-" é substituído por "#":

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

Fonte: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Conforme afirmado por Sagneta: O truque # hash no Windows está disponível apenas para executáveis ​​python nativos. isso não funcionará para implementações de python baseadas em cygwin.


fonte
3
Isto está certo. Observe, entretanto, que o truque do hash # no Windows está disponível apenas para executáveis ​​python nativos. Em outras palavras, isso não funcionará para implementações de python baseadas em cygwin.
sagneta
2
Uau, é ótimo saber, mas estou horrorizado com as consequências. Estou testando a formatação de data retornada de um banco de dados e preciso passar na formatação esperada para cada teste e isso adiciona muita complexidade.
Keith de
12

Boa resposta de Chris Freeman no Linux.

No Windows, é:

mydate.strftime('%#m/%#d/%Y')

Achei que isso pudesse ajudar.

user3685285
fonte
0

"% l" (que é um L minúsculo) funciona para a hora (em vez de "% I"). Eu só sei disso por outra resposta aqui

Python strftime - data sem início de 0?

mas, infelizmente, eles não têm o código para os outros elementos de uma data / hora.

Rob Cranfill
fonte
pd.to_datetime (dt ['Time'], format = '% l:% M:% S', infer_datetime_format = True) Depois de tentar% l ainda não funciona para mim Erro: - Arquivo "pandas_libs \ tslibs \ conversion.pyx" , linha 399, em pandas._libs.tslibs.conversion.convert_datetime_to_tsobject File "pandas_libs \ tslibs \ np_datetime.pyx", linha 117, em pandas._libs.tslibs.np_datetime.check_dtsetimeDounds_bounds pandasdatetime.pyx ", linha 117, em pandas._libs.tslibs.np_datetime.check_dtsetimeDounds_bounds pandasdatetime.pyx", linha 117, em pandas._libs.tslibs.np_datetime.check_dtsetimeDounds_bounds pandasdatetime. limite de tempo de nanossegundos: 01-01-01 09:15:59
Ankur Tripathi