Come stampare una data in un formato normale?


683

Questo è il mio codice:

import datetime
today = datetime.date.today()
print(today)

Questo stampa: 2008-11-22che è esattamente quello che voglio.

Ma ho un elenco a cui sto aggiungendo questo e poi all'improvviso tutto diventa "traballante". Ecco il codice:

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

Ciò stampa quanto segue:

[datetime.date(2008, 11, 22)]

Come posso ottenere un semplice appuntamento come 2008-11-22?


13
La risposta breve: applicando str()(a ciascun elemento dell'elenco), perché è proprio quello che ha printimplicitamente fatto l' todayoggetto solista .
Lutz Prechelt,

Risposte:


949

PERCHÉ: le date sono oggetti

In Python, le date sono oggetti. Pertanto, quando li manipoli, manipoli oggetti, non stringhe, né timestamp né altro.

Qualsiasi oggetto in Python ha DUE rappresentazioni di stringhe:

  • La rappresentazione regolare utilizzata da "stampa" può essere ottenuta utilizzando la str()funzione. È il più delle volte il più comune formato leggibile dall'uomo e viene utilizzato per facilitare la visualizzazione. Quindi str(datetime.datetime(2008, 11, 22, 19, 53, 42))ti dà '2008-11-22 19:53:42'.

  • La rappresentazione alternativa utilizzata per rappresentare la natura dell'oggetto (come dati). Può essere utile utilizzare la repr()funzione ed è utile sapere quale tipo di dati manipoli mentre sviluppi o esegui il debug. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))ti dà 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Quello che è successo è che quando hai stampato la data usando "print", è stata usata str()per vedere una bella stringa di date. Ma quando hai stampato mylist, hai stampato un elenco di oggetti e Python ha provato a rappresentare l'insieme di dati, usando repr().

The How: cosa vuoi fare con quello?

Bene, quando manipoli le date, continua a usare gli oggetti data per tutto il tempo. Hanno ottenuto migliaia di metodi utili e la maggior parte dell'API Python prevede che le date siano oggetti.

Quando vuoi visualizzarli, basta usare str(). In Python, la buona pratica è lanciare esplicitamente tutto. Quindi proprio quando è il momento di stampare, ottieni una rappresentazione in formato stringa della tua data usando str(date).

Un'ultima cosa. Quando hai provato a stampare le date, hai stampato mylist. Se si desidera stampare una data, è necessario stampare gli oggetti data, non il loro contenitore (l'elenco).

Ad esempio, vuoi stampare tutta la data in un elenco:

for date in mylist :
    print str(date)

Nota che in quel caso specifico , puoi persino omettere str()perché print lo userà per te. Ma non dovrebbe diventare un'abitudine :-)

Caso pratico, usando il tuo codice

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

Formattazione data avanzata

Le date hanno una rappresentazione predefinita, ma potresti volerle stampare in un formato specifico. In tal caso, è possibile ottenere una rappresentazione di stringa personalizzata utilizzando il strftime()metodo

strftime() si aspetta uno schema a corde che spieghi come si desidera formattare la data.

PER ESEMPIO :

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

Tutta la lettera dopo un "%"rappresenta un formato per qualcosa:

  • %d è il numero del giorno
  • %m è il numero del mese
  • %b è l'abbreviazione del mese
  • %y sono le ultime due cifre dell'anno
  • %Y è tutto l'anno

eccetera

Dai un'occhiata alla documentazione ufficiale o al riferimento rapido di McCutchen che non puoi conoscere tutti.

A partire da PEP3101 , ogni oggetto può avere il proprio formato utilizzato automaticamente dal formato del metodo di qualsiasi stringa. Nel caso del datetime, il formato è lo stesso usato in strftime. Quindi puoi fare come sopra in questo modo:

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

Il vantaggio di questo modulo è che puoi anche convertire altri oggetti contemporaneamente.
Con l'introduzione dei letterali di stringhe formattate (da Python 3.6, 23-12-2016), questo può essere scritto come

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

Localizzazione

Le date possono adattarsi automaticamente alla lingua e alla cultura locale se le usi nel modo giusto, ma è un po 'complicato. Forse per un'altra domanda su SO (StackTranslate.it) ;-)


3
BTW Quasi ogni tipo di dati in Python è una classe (ad eccezione immutabili, ma possono essere sottoclassi) stackoverflow.com/questions/865911/...
Yauhen Yakimovich

1
Cosa intendi con "quasi"? str e int hanno un attributo class , che contiene 'type', per cui ci sono class sé stessi, in quanto sono istanze di tipo metaclasse.
e-soddisfa il

4
Questa è esattamente la questione della terminologia: type! = Class ?, ovvero è sufficiente avere l'attributo type (fornire un meccanismo di inferenza del tipo per essere qualificato per un oggetto) o l'entità dovrebbe comportarsi come un oggetto. Sto provando a risolverlo da solo qui programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich,

1
Se sei un'istanza di una classe, sei un oggetto. Perché ne avresti bisogno per essere più complicato?
e-satis,

9
Ogni valore in Python è un oggetto. Ogni oggetto ha un tipo. "type" == "class" formalmente (vedi anche inspect.isclassper assicurarti). Le persone tendono a dire "tipo" per i built-in e "classe" per il resto, ma questo non è importante
Kos

341
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Modificare:

Dopo il suggerimento di Cees, ho iniziato a usare anche il tempo:

import time
print time.strftime("%Y-%m-%d %H:%M")

6
datetime.datetime?
Cees Timmerman,

2
È possibile utilizzare da datetime import datetimee quindi print datetime().now().strftime("%Y-%m-%d %H:%M"). Solo una differenza di sintassi.
Daniel Magnusson,

7
from datetime import date; date.today().strftime("%Y-%m-%d")mi sembra ancora poco realistico, ma è il migliore senza import time. Penso che il modulo datetime sia per la matematica della data.
Cees Timmerman,

2
il mio preferito è from datetime import datetime as dte ora possiamo giocare condt.now()
diewland il

165

Gli oggetti data, datetime e time supportano tutti un metodo strftime (format), per creare una stringa che rappresenta l'ora sotto il controllo di una stringa di formato esplicita.

Ecco un elenco dei codici di formato con la loro direttiva e significato.

    %a  Locales abbreviated weekday name.
    %A  Locales full weekday name.      
    %b  Locales abbreviated month name.     
    %B  Locales full month name.
    %c  Locales appropriate date and time representation.   
    %d  Day of the month as a decimal number [01,31].    
    %f  Microsecond as a decimal number [0,999999], zero-padded on the left
    %H  Hour (24-hour clock) as a decimal number [00,23].    
    %I  Hour (12-hour clock) as a decimal number [01,12].    
    %j  Day of the year as a decimal number [001,366].   
    %m  Month as a decimal number [01,12].   
    %M  Minute as a decimal number [00,59].      
    %p  Locales equivalent of either AM or PM.
    %S  Second as a decimal number [00,61].
    %U  Week number of the year (Sunday as the first day of the week)
    %w  Weekday as a decimal number [0(Sunday),6].   
    %W  Week number of the year (Monday as the first day of the week)
    %x  Locales appropriate date representation.    
    %X  Locales appropriate time representation.    
    %y  Year without century as a decimal number [00,99].    
    %Y  Year with century as a decimal number.   
    %z  UTC offset in the form +HHMM or -HHMM.
    %Z  Time zone name (empty string if the object is naive).    
    %%  A literal '%' character.

Questo è ciò che possiamo fare con i moduli datetime e time in Python

    import time
    import datetime

    print "Time in seconds since the epoch: %s" %time.time()
    print "Current date and time: ", datetime.datetime.now()
    print "Or like this: ", datetime.datetime.now().strftime("%y-%m-%d-%H-%M")


    print "Current year: ", datetime.date.today().strftime("%Y")
    print "Month of year: ", datetime.date.today().strftime("%B")
    print "Week number of the year: ", datetime.date.today().strftime("%W")
    print "Weekday of the week: ", datetime.date.today().strftime("%w")
    print "Day of year: ", datetime.date.today().strftime("%j")
    print "Day of the month : ", datetime.date.today().strftime("%d")
    print "Day of week: ", datetime.date.today().strftime("%A")

Che stamperà qualcosa del genere:

    Time in seconds since the epoch:    1349271346.46
    Current date and time:              2012-10-03 15:35:46.461491
    Or like this:                       12-10-03-15-35
    Current year:                       2012
    Month of year:                      October
    Week number of the year:            40
    Weekday of the week:                3
    Day of year:                        277
    Day of the month :                  03
    Day of week:                        Wednesday

1
Ciò ha risolto il mio problema in cui le "risposte più votate" no. Ma il mio problema era diverso dai PO. Volevo che i mesi fossero stampati come testo ("febbraio" anziché "2")
Nathan il

73

Usa date.strftime. Gli argomenti di formattazione sono descritti nella documentazione .

Questo è quello che volevi:

some_date.strftime('%Y-%m-%d')

Questo tiene conto di Locale. (Fai questo)

some_date.strftime('%c')

36

Questo è più breve:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'

27
# convert date time to regular format.

d_date = datetime.datetime.now()
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

PRODUZIONE

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34

25

O anche

from datetime import datetime, date

"{:%d.%m.%Y}".format(datetime.now())

Fuori: '25 .12.2013

o

"{} - {:%d.%m.%Y}".format("Today", datetime.now())

Fuori: 'Oggi - 25.12.2013'

"{:%A}".format(date.today())

Fuori: 'mercoledì'

'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())

Fuori: '__main ____ 2014.06.09__16-56.log'



8

Con datetimela formattazione di stringa specifica del tipo (vedi la risposta di nk9 utilizzando str.format().) In un valore letterale di stringa formattata (da Python 3.6, 23-12-2016):

>>> import datetime
>>> f"{datetime.datetime.now():%Y-%m-%d}"
'2017-06-15'

Le direttive formato data / ora non sono documentate come parte del Format String Sintassi ma piuttosto in date, datetimee time's strftime()documentazione. Si basano sullo standard C del 1989, ma includono alcune direttive ISO 8601 da Python 3.6.


Nota che ho anche aggiunto queste informazioni alla risposta accettata .
maniglia

strftime in realtà non include un "output ISO 8601". Ci sono "direttive", ma solo per token specifici come "giorno della settimana", non un intero timestamp ISO 8601, che ho sempre trovato fastidioso.
anarcat,

5

È necessario convertire l'oggetto data e ora in una stringa.

Il seguente codice ha funzionato per me:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

Fammi sapere se hai bisogno di ulteriore aiuto.


3
Dai ! Non incoraggiare un principiante a memorizzare una stringa anziché un oggetto data. Non sarà in grado di sapere quando è una buona o una cattiva idea ...
e-soddisfa il

e-satis: se tutto ciò che serve è una stringa, qual è il grosso problema? Memorizziamo continuamente le date di creazione del nostro firmware come stringhe - a volte la memorizzazione di un intero oggetto è eccessiva quando tutto ciò di cui hai bisogno è un semplice timestamp (YAGNI e tutti).
HanClinto,

3
Sì, in alcuni casi lo è. Voglio solo dire che solo un principiante non sarà in grado di identificare questi casi. Quindi cominciamo con il piede giusto :-)
e-satis

4

Odio l'idea di importare troppi moduli per comodità. Preferirei lavorare con il modulo disponibile che in questo caso è datetimepiuttosto che chiamare un nuovo modulo time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'

1
Penso che sarebbe più efficiente farlo in una riga di codice facendoa = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore


3

Considerando il fatto che hai chiesto qualcosa di semplice per fare quello che volevi, potresti semplicemente:

import datetime
str(datetime.date.today())

3

Per coloro che desiderano una data basata sulle impostazioni locali e non includere l'ora, utilizzare:

>>> some_date.strftime('%x')
07/11/2019

2

Potresti volerlo aggiungere come una stringa?

import datetime 
mylist = [] 
today = str(datetime.date.today())
mylist.append(today) 
print mylist

2

Dal momento print todayche restituisce ciò che vuoi, significa che l'oggetto di oggi__str__ funzione restituisce la stringa che stai cercando.

Quindi puoi fare mylist.append(today.__str__())anche tu .



1

Un rapido disclaimer per la mia risposta: imparo Python da circa 2 settimane, quindi non sono affatto un esperto; pertanto, la mia spiegazione potrebbe non essere la migliore e potrei usare una terminologia errata. Comunque, eccola qui.

Ho notato nel tuo codice che quando hai dichiarato la tua variabile today = datetime.date.today()hai scelto di nominare la tua variabile con il nome di una funzione integrata.

Quando la tua prossima riga di codice ha mylist.append(today)aggiunto il tuo elenco, ha aggiunto l'intera stringa datetime.date.today(), che avevi precedentemente impostato come valore della tua todayvariabile, piuttosto che aggiungere semplicementetoday() .

Una soluzione semplice, anche se forse non la maggior parte dei programmatori userebbe quando si lavora con il modulo datetime, è quello di cambiare il nome della variabile.

Ecco cosa ho provato:

import datetime
mylist = []
present = datetime.date.today()
mylist.append(present)
print present

e stampa yyyy-mm-dd.


1

Ecco come visualizzare la data come (anno / mese / giorno):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)

1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

questo stampa il 6-23-2018 se è quello che vuoi :)


-1
import datetime
import time

months = ["Unknown","January","Febuary","Marchh","April","May","June","July","August","September","October","November","December"]
datetimeWrite = (time.strftime("%d-%m-%Y "))
date = time.strftime("%d")
month= time.strftime("%m")
choices = {'01': 'Jan', '02':'Feb','03':'Mar','04':'Apr','05':'May','06': 'Jun','07':'Jul','08':'Aug','09':'Sep','10':'Oct','11':'Nov','12':'Dec'}
result = choices.get(month, 'default')
year = time.strftime("%Y")
Date = date+"-"+result+"-"+year
print Date

In questo modo puoi ottenere la formattazione della data come in questo esempio: 22-giu-2017


1
Troppo codice per qualcosa che potresti ottenere in una riga. Con %bte otterrai le prime parole di tre mesi e con %Bl'intero mese. Esempio: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")restituirà '2018-ott-04 09:44:08'
Víctor López

-1

Non capisco del tutto, ma posso usare pandasper ottenere i tempi nel giusto formato:

>>> import pandas as pd
>>> pd.to_datetime('now')
Timestamp('2018-10-07 06:03:30')
>>> print(pd.to_datetime('now'))
2018-10-07 06:03:47
>>> pd.to_datetime('now').date()
datetime.date(2018, 10, 7)
>>> print(pd.to_datetime('now').date())
2018-10-07
>>> 

E:

>>> l=[]
>>> l.append(pd.to_datetime('now').date())
>>> l
[datetime.date(2018, 10, 7)]
>>> map(str,l)
<map object at 0x0000005F67CCDF98>
>>> list(map(str,l))
['2018-10-07']

Ma memorizza le stringhe ma è facile da convertire:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]

4
Un'intera dipendenza per fare qualcosa di python libreria std ha metodi da fare?
Hejazzman,
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.