Formattazione datetime di Python senza riempimento zero


90

Esiste un formato per la stampa di datetimes Python che non utilizzerà la spaziatura interna zero su date e orari?

Formato che sto usando ora:

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

Risultato: 29/02/2012 17:03
Desiderato: 29/02/2012 17:03

Quale formato rappresenterebbe il mese come "2" invece di "02" e l'ora come "17:03" invece di "05: 03"

Risposte:


77

Le opzioni di formattazione disponibili con datetime.strftime()lo zero pad. Ovviamente potresti eseguire la tua funzione di formattazione, ma la soluzione più semplice in questo caso potrebbe essere quella di post-elaborare il risultato di datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

1
Sven- Perché voglio assomigliare a Facebook. Grazie!
Yarin

4
Pochissime persone usano le ore zero riempite in Nord America per scrivere l'ora a mano.
Eric Walker

2
Non sarà ancora zero pad il giorno del mese?
Giudice Maygarden

1
@ JudgeMaygarden: Ecco perché la soluzione serve .lstrip("0")a sbarazzarsi dello zero iniziale.
Sven Marnach,

1
Perché voglio rimuovere gli zeri del pad? Perché questo è sbagliato da RFC 2822 , ad esempio nel feed podcast.
Vitaly Zdanevich

172

L'altra alternativa per evitare l'aspetto "tutto o niente" che precede lo zero sopra è mettere un segno meno davanti al tipo di campo:

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

Quindi questo: "4/10/2015 03:00 AM"

Diventa: "4/10/2015 3:00 AM"

Se lo desideri, puoi inserire un segno meno davanti al giorno.

Modifica: la funzione meno deriva dalla libreria GNU C ("glibc") come menzionato nella pagina di manuale di Linux strftime sotto "Note Glibc"


50
Ottima risposta, ma solo Linux. Non funzionerà su Windows. stackoverflow.com/questions/10807164/...
ExactaBox

1
Perché funziona? Non riesco a trovare un riferimento a questo nei documenti per date.__format__or time.strftime, docs.python.org/3/library/… e docs.python.org/3.8/library/time.html#time.strftime rispettivamente
Amin Shah Gilani

95

Il nuovo sistema di formattazione delle stringhe fornisce un'alternativa a strftime. È abbastanza leggibile, anzi, potrebbe essere preferibile per strftimequesto motivo. Per non parlare del fatto che non ha pad zero:

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

Dal momento che probabilmente vuoi zero padding nel campo dei minuti, potresti farlo:

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

Se vuoi tempo "normale" invece di tempo "militare", puoi comunque utilizzare anche gli strftimespecificatori standard . Per comodità, per i nostri scopi, strftime fa fornire un codice per il tempo imbottita di 12 ore con un vuoto al posto di uno zero:

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

Questo diventa un po 'meno leggibile, ahimè. E come sottolinea @mlissner, strftimefallirà su alcune (tutte?) Piattaforme per date prima del 1900.


1
È in circolazione da Python 2.6. (Non è così nuovo.)
senderle

3
Per spiegare il mese, ad esempio, puoi usare quanto segue: "{0.day} {0:%B %Y}".format(d)che ti darebbe '2 August 2013'come il giorno di questo commento :)
Jens

2
Questo è interessante, ma in realtà non risponde a OP, perché vuole le ore AM / PM. In realtà non ho intenzione di ridimensionarlo, ma la risposta accettata è effettivamente corretta se stai cercando di ottenere la formattazione di data / ora "americana" in Python.
Dana Cartwright

Nota che questa tecnica utilizza strftime, che fallirà nelle date precedenti al 1900. Se hai vecchie date, te ne pentirai.
mlissner

1
fak! Mi sono appena reso conto di dove non ho puntato d su un altro oggetto, l'ho semplicemente passato come argomento posizionale.
JacobIRR

54

Risposta accettata non una soluzione adeguata (IMHO) I metodi documentati appropriati:

In Linux "#" è sostituito da "-":

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

In Windows "-" è sostituito da "#":

% # 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

Come affermato da Sagneta: il trucco # hash su Windows è disponibile solo per eseguibili nativi di Python. questo non funzionerà per le implementazioni di Python basate su cygwin.


3
Questo è corretto. Nota tuttavia che il trucco # hash su Windows è disponibile solo per gli eseguibili nativi di Python. In altre parole, questo non funzionerà per le implementazioni di Python basate su cygwin.
sagneta

2
Wow è fantastico saperlo, ma sono inorridito dalle conseguenze. Sto testando la formattazione della data restituita da un database e devo passare la formattazione prevista per ogni test e questo aggiunge tonnellate di complessità.
Keith

12

Buona risposta da Chris Freeman su Linux.

Su Windows, è:

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

Ho pensato che potrebbe aiutare.


0

"% l" (che è una L minuscola) funziona per l'ora (invece di "% I"). Lo so solo da un'altra risposta qui

Python strftime - data senza 0 iniziale?

ma sfortunatamente non hanno il codice per gli altri elementi di una data / ora.


pd.to_datetime (dt ['Time'], format = '% l:% M:% S', infer_datetime_format = True) Dopo aver provato% l ancora non funziona per me Errore: - File "pandas_libs \ tslibs \ conversion.pyx" , riga 399, in pandas._libs.tslibs.conversion.convert_datetime_to_tsobject File "pandas_libs \ tslibs \ np_datetime.pyx", riga 117, in pandas._libs.tslibs.np_datetime.check_dts_bounds pandas_datetime.libs. limiti nanosecondi timestamp: 1-01-01 09:15:59
Ankur Tripathi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.