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.