Python strftime - data senza inizio 0?


277

Quando si usa Python strftime, c'è un modo per rimuovere il primo 0 della data se è prima del decimo, cioè. così 01è 1? Non riesci a trovare %qualcosa per quello?

Grazie!

Risposte:


568

In realtà ho avuto lo stesso problema e mi sono reso conto che, se aggiungi un trattino tra la %e la lettera, puoi rimuovere lo zero iniziale.

Per esempio %Y/%-m/%-d.

Funziona solo su Unix (Linux, OS X), non su Windows (incluso Cygwin). Su Windows, useresti #, ad es %Y/%#m/%#d.


11
Non funziona nemmeno per me, dà un ValueError (windows, python 2.6)
rocketmonkeys

14
Ha funzionato per me su OS X, ma sto usando Python 2.7.2 da python.org.
Tim Swast,

13
@moose Ho fatto una domanda al riguardo :-) ecco la risposta -> stackoverflow.com/questions/28894172/…
Mathias

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

8
%#dfarebbe lo stesso su Windows
dalle

190

Possiamo fare questo genere di cose con l'avvento del formatmetodo da python2.6:

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

Anche se forse oltre la portata della domanda originale, per formati più interessanti, puoi fare cose come:

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

E a partire da python3.6, questo può essere espresso come una stringa formattata in linea :

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
Molto bella! Sfortunatamente non funziona da solo se si desidera utilizzare una rappresentazione testuale come time.strftime('%A %B %d, %Y'), che produce (ora, su impostazioni locali inglesi) Tuesday October 07, 2014.
Pekka Klärck,

@ PekkaKlärck - Alcuni motivi per cui non avevo notato il tuo commento fino ad ora. Si scopre che datetime specifica un __format__hook molto interessante che ti permette di scrivere cose del genere.
mgilson,

2
Un problema è che '{dt.hour}'utilizza un orologio di 24 ore :(. L'uso della seconda opzione ti riporta ancora all'utilizzo '{%#I}'su Windows e '{%-I}'su Unix.
ubomb

Buon punto. Non uso mai le rappresentazioni dell'orologio a 12 ore nel codice, quindi non ho pensato a quel caso.
mgilson,

Suggerirei di guardare questa documentazione aggiuntiva sulla funzionalità del formato: pyformat.info
Segna il

37

Alcune piattaforme potrebbero supportare specifiche di larghezza e precisione tra %e la lettera (come 'd' per il giorno del mese), secondo http://docs.python.org/library/time.html - ma è sicuramente un non portatile soluzione (ad es. non funziona sul mio Mac ;-). Forse puoi usare una stringa di sostituzione (o RE, per un formato davvero brutto) dopo il strftimerimedio? per esempio:

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

@guneiso che vuoi dire? Dovrebbe risultare in "1 gennaio 2000"
Utente

6
@Utente Il codice sopra riportato verifica uno spazio vuoto prima di 0 che nel caso di "01 gennaio 2000" non è presente.
Alagappan Ramu,

@alex Per favore cancella questa risposta, come probabilmente sai, è tutt'altro che una risposta corretta.
CONvido

29

Ecco la documentazione dei modificatori supportati da strftime()nella libreria GNU C. (Come la gente ha detto prima, potrebbe non essere portatile.) Di tuo interesse potrebbe essere:

  • %einvece di %dsostituirà lo zero iniziale nel giorno del mese con uno spazio

Funziona sul mio Python (su Linux). Non so se funzionerà sul tuo.


3
% e non riesce per me su Windows con Python 2.6. Immagino che sia * nix specifico. Peccato :(
rocketmonkeys il

1
Questa è la soluzione più pulita, più generale, --- su un sistema * nix, almeno. Funziona su OS X.
BFTM

Come %-d sopra , funziona in OS X 10.8.5 con Python 2.7.2, ma non in Windows 7 Pro 64-bit con Python 2.7.3.
Johan

1
Questo ha funzionato per me su Windows 7 SP1 con Python 3.5.1.
Neil Billingham,

1
Ciò ha introdotto uno spazio aggiuntivo anziché lo zero iniziale, quindi se stai cercando una corrispondenza esatta potrebbe non esserlo. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 maggio 23' >>> undici = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> undici.strftime ('% b% e% H')
'11

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
Funziona il 1 ° gennaio 2000, Alexs non funziona.
guneiso

Che senso ha fare .replace('X0','X').replace('X','')? Fallo .replace('X0', '')e andrà bene.
Marco Bonelli,

2
@MarcoBonelli: prova il tuo suggerimento sulla stringa "X12 / X12 / 14" e vedrai.
gdw2,

1
Questo è un hack, ma è un trucco pitonico.
Josh M.,



10

Trovo che il filtro di formattazione della data del modello Django sia semplice e veloce. Elimina gli zeri iniziali. Se non ti dispiace importare il modulo Django, dai un'occhiata.

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

Nota che se sei come me e non stai costruendo la tua app in Django, dovrai dire a Django che non è necessario configurarlo:import django.conf django.conf.settings.configure()
Alex Pretzlav,

8

Dai un'occhiata a -muggito:

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

Funziona perfettamente in Python 3
Saurabh,

Questa dovrebbe essere la risposta accettata. Fa quello che viene chiesto, super semplice e facile da ricordare. Navigando rapidamente tra i documenti non sono stato in grado di trovare queste informazioni.
Lucas Lima,

1
"Questa dovrebbe essere la risposta accettata". No, non dovrebbe, poiché funziona solo su Linux.
user136036


3

Perché %dpuoi convertirlo in intero usando int()quindi rimuoverà automaticamente lo 0 iniziale e diventa intero. È quindi possibile riconvertire in stringa utilizzando str().


2
La domanda OP era per una soluzione che utilizzava un identificatore di formato in una chiamata a strftime, piuttosto che una soluzione roll-your-own che coinvolge str ()
Dave Hooper

ottima risposta, non ascoltare
Dave Hooper

3

l'utilizzo, ad esempio, "% -d" non è portatile anche tra versioni diverse dello stesso sistema operativo. Una soluzione migliore sarebbe quella di estrarre i componenti della data singolarmente e scegliere tra operatori di formattazione specifici della data e accesso all'attributo della data per ciascun componente.

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

2

Poiché Python chiama semplicemente la strftime(3)funzione del linguaggio C sulla tua piattaforma, è possibile che ci siano caratteri di formato che potresti usare per controllare lo zero iniziale; provareman strftime dare un'occhiata. Ma, naturalmente, il risultato non sarà portatile, come ricorderà il manuale di Python. :-)

Proverei invece a utilizzare un datetimeoggetto di nuovo stile , che ha attributi come t.yeare t.monthe t.day, e li inserisce attraverso la normale formattazione ad alta potenza %dell'operatore, che supporta il controllo degli zeri iniziali. Vedi http://docs.python.org/library/datetime.html per i dettagli. Meglio ancora, usa l' "".format()operatore se il tuo Python lo possiede ed essere ancora più moderno; ha molte opzioni di formato anche per i numeri. Vedi: http://docs.python.org/library/string.html#string-formatting .


2

Basato sul metodo di Alex, questo funzionerà sia per i casi di inizio stringa che after-space:

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

Mi piace di più di .format o% -d perché è multipiattaforma e mi permette di continuare a usare strftime (per ottenere cose come "November" e "Monday").


1

Vecchia domanda, ma% l (L minuscola) ha funzionato per me in breve tempo: questo potrebbe non funzionare per tutti, tuttavia, poiché non è elencato nella documentazione di Python che ho trovato


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

Questo sostituisce lo zero iniziale con uno spazio, che non è quello che l'OP ha richiesto
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'usando python 3.5
ji-ruh,
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.