¿Cómo imprimir una fecha en un formato normal?

682

Este es mi código:

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

Esto imprime: 2008-11-22que es exactamente lo que quiero.

Pero, tengo una lista a la que le agrego esto y de repente todo se vuelve "inestable". Aquí está el código:

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

Esto imprime lo siguiente:

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

¿Cómo puedo obtener una cita simple 2008-11-22?

NomadAlien
fuente
13
La respuesta corta: aplicando str()(a cada elemento de la lista), porque eso es exactamente lo que printimplícitamente hizo a su todayobjeto solo .
Lutz Prechelt

Respuestas:

947

El POR QUÉ: las fechas son objetos

En Python, las fechas son objetos. Por lo tanto, cuando los manipulas, manipulas objetos, no cadenas, ni marcas de tiempo ni nada.

Cualquier objeto en Python tiene DOS representaciones de cadena:

  • La representación regular que usa "print" se puede obtener usando la str()función. Es la mayoría de las veces el formato legible por humanos más común y se utiliza para facilitar la visualización. Entonces str(datetime.datetime(2008, 11, 22, 19, 53, 42))te da '2008-11-22 19:53:42'.

  • La representación alternativa que se utiliza para representar la naturaleza del objeto (como datos). Se puede obtener usando la repr()función y es útil para saber qué tipo de datos está manipulando mientras está desarrollando o depurando. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))le da 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Lo que sucedió es que cuando imprimiste la fecha usando "imprimir", se usó str()para que pudieras ver una bonita cadena de fecha. Pero cuando imprimió mylist, imprimió una lista de objetos y Python intentó representar el conjunto de datos, utilizando repr().

El Cómo: ¿qué quieres hacer con eso?

Bueno, cuando manipulas fechas, sigue usando los objetos de fecha todo el tiempo. Obtuvieron miles de métodos útiles y la mayoría de las API de Python esperan que las fechas sean objetos.

Cuando desee mostrarlos, simplemente utilícelos str(). En Python, la buena práctica es lanzar explícitamente todo. Entonces, cuando sea hora de imprimir, obtenga una representación de cadena de su fecha usando str(date).

Una última cosa. Cuando trataste de imprimir las fechas, imprimiste mylist. Si desea imprimir una fecha, debe imprimir los objetos de fecha, no su contenedor (la lista).

Por ejemplo, desea imprimir toda la fecha en una lista:

for date in mylist :
    print str(date)

Tenga en cuenta que en ese caso específico , incluso puede omitir str()porque print lo usará para usted. Pero no debería convertirse en un hábito :-)

Caso práctico, usando tu código

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

Formato de fecha avanzado

Las fechas tienen una representación predeterminada, pero es posible que desee imprimirlas en un formato específico. En ese caso, puede obtener una representación de cadena personalizada utilizando el strftime()método

strftime() espera un patrón de cadena que explique cómo desea formatear su fecha.

P.EJ :

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

Todas las letras después de un "%"representan un formato para algo:

  • %d es el número del día
  • %m es el número del mes
  • %b es la abreviatura del mes
  • %y es el año dos últimos dígitos
  • %Y es todo el año

etc.

Eche un vistazo a la documentación oficial , o la referencia rápida de McCutchen, no puede conocerlos todos.

Desde PEP3101 , cada objeto puede tener su propio formato utilizado automáticamente por el formato del método de cualquier cadena. En el caso de datetime, el formato es el mismo utilizado en strftime. Entonces puedes hacer lo mismo de arriba así:

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

La ventaja de este formulario es que también puede convertir otros objetos al mismo tiempo.
Con la introducción de los literales de cadena con formato (desde Python 3.6, 2016-12-23) esto se puede escribir

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

Localización

Las fechas pueden adaptarse automáticamente al idioma y la cultura local si las usa de la manera correcta, pero es un poco complicado. Tal vez para otra pregunta sobre SO (desbordamiento de pila) ;-)

e-satis
fuente
3
Por cierto, casi todos los tipos de datos en python son una clase (excepto los inmutables, pero se pueden subclasificar) stackoverflow.com/questions/865911/…
Yauhen Yakimovich
1
¿Qué quieres decir con "casi"? str e int tienen un atributo de clase , que contiene 'tipo', por lo tanto, hay clases ellos mismos, ya que son instancias de metaclase de tipo.
e-satis
44
Esta es exactamente la cuestión de la terminología: ¿tipo! = Clase ?, es decir, es suficiente tener un atributo de tipo (proporcionar un mecanismo de inferencia de tipo para ser calificado para un objeto) o si la entidad debe comportarse como un objeto. Estoy tratando de resolver esto por mí mismo aquí programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich
1
Si eres una instancia de una clase, eres un objeto. ¿Por qué necesitarías que sea más complicado?
e-satis
99
Cada valor en Python es un objeto. Cada objeto tiene un tipo. "type" == "class" formalmente (ver también inspect.isclasspara asegurarse). La gente tiende a decir "escribir" para los complementos y "clase" para el resto, pero eso no es importante
Kos
340
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Editar:

Después de la sugerencia de Cees, también comencé a usar el tiempo:

import time
print time.strftime("%Y-%m-%d %H:%M")
Daniel Magnusson
fuente
66
datetime.datetime?
Cees Timmerman
2
Puede usar desde datetime import datetimey luego print datetime().now().strftime("%Y-%m-%d %H:%M"). Solo una diferencia de sintaxis.
Daniel Magnusson el
77
from datetime import date; date.today().strftime("%Y-%m-%d")Todavía no me parece nada, pero eso es lo mejor sin él import time. Creo que el módulo de fecha y hora es para matemáticas de fecha.
Cees Timmerman
2
mi favorito es from datetime import datetime as dty ahora podemos jugar condt.now()
diewland
164

Los objetos date, datetime y time admiten un método strftime (formato) para crear una cadena que represente la hora bajo el control de una cadena de formato explícito.

Aquí hay una lista de los códigos de formato con su directiva y significado.

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

Esto es lo que podemos hacer con los módulos de fecha y hora en 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")

Eso imprimirá algo como esto:

    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
Transformador
fuente
1
Esto resolvió mi problema donde las "respuestas más votadas" no. Pero mi problema era diferente a los OP. Quería meses impresos como texto ("febrero" en lugar de "2")
Nathan
73

Use date.strftime. Los argumentos de formato se describen en la documentación .

Este es lo que querías:

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

Este tiene a Locale en cuenta. (hacer esto)

some_date.strftime('%c')
Ali Afshar
fuente
36

Esto es más corto:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
Cees Timmerman
fuente
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)

SALIDA

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34
Waqas Ali
fuente
25

O incluso

from datetime import datetime, date

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

Fuera: '25 .12.2013

o

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

Fuera: 'Hoy - 25.12.2013'

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

Fuera: 'miércoles'

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

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

b1_
fuente
14

Respuesta simple -

datetime.date.today().isoformat()
Llama de udun
fuente
8

Con el datetimeformato de cadena específico del tipo (consulte la respuesta de nk9 usando str.format().) En un literal de cadena con formato (desde Python 3.6, 2016-12-23):

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

Las directivas de formato de fecha / hora no se documentan como parte de la Cadena de formato de sintaxis , sino más bien en date, datetimey time's strftime()documentación. Se basan en el Estándar C 1989, pero incluyen algunas directivas ISO 8601 desde Python 3.6.

encargarse de
fuente
Tenga en cuenta que también he agregado esta información a la respuesta aceptada .
manejar el
strftime realmente no incluye una "salida ISO 8601". Hay "directivas", pero solo para tokens específicos como "día de la semana", no una marca de tiempo ISO 8601 completa, que siempre he encontrado molesto.
anarcat
5

Necesita convertir el objeto de fecha y hora en una cadena.

El siguiente código funcionó para mí:

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

Avísame si necesitas más ayuda.

Simon Johnson
fuente
3
Venga ! No aliente a un novato a almacenar una cadena en lugar de un objeto de fecha. No podrá saber cuándo es una buena o una mala idea ...
e-satis
e-satis: Si todo lo que necesitas es una cadena, ¿cuál es el problema? Almacenamos nuestras fechas de compilación de firmware como cadenas todo el tiempo; a veces, almacenar un objeto completo es excesivo cuando todo lo que necesita es una simple marca de tiempo (YAGNI y todo).
HanClinto
3
Sí, en cierto caso lo es. Solo quiero decir que un novato no podrá identificar estos casos. Comencemos con el pie derecho :-)
e-satis
4

Odio la idea de importar demasiados módulos por conveniencia. Prefiero trabajar con el módulo disponible, que en este caso es datetimemás que llamar a un nuevo módulo time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
rickydj
fuente
1
Creo que sería más eficiente hacer eso en una línea de código al hacer estoa = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore
3

Tu puedes hacer:

mylist.append(str(today))
Igal Serban
fuente
3

Teniendo en cuenta el hecho de que pidió algo simple para hacer lo que quería, podría simplemente:

import datetime
str(datetime.date.today())
Ward Taya
fuente
3

Para aquellos que desean una fecha basada en la configuración regional y que no incluyen la hora, use:

>>> some_date.strftime('%x')
07/11/2019
Liran H
fuente
2

¿Es posible que desee agregarlo como una cadena?

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

Dado que print todaydevuelve lo que quiere, esto significa que el objeto de hoy__str__ función devuelve la cadena que está buscando.

Entonces tú también puedes hacerlo mylist.append(today.__str__()).

Ismail Elouafiq
fuente
1

Puede usar easy_date para facilitarlo:

import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
Raphael Amoedo
fuente
1

Un descargo de responsabilidad rápido para mi respuesta: solo he estado aprendiendo Python durante aproximadamente 2 semanas, por lo que de ninguna manera soy un experto; por lo tanto, mi explicación puede no ser la mejor y puedo usar una terminología incorrecta. De todos modos, aquí va.

Noté en su código que cuando declaró su variable today = datetime.date.today(), eligió nombrar su variable con el nombre de una función incorporada.

Cuando su siguiente línea de código mylist.append(today)agregó su lista, agregó toda la cadena datetime.date.today(), que previamente había establecido como el valor de su todayvariable, en lugar de solo agregartoday() .

Una solución simple, aunque tal vez no sea la que la mayoría de los codificadores usaría al trabajar con el módulo de fecha y hora, es cambiar el nombre de su variable.

Esto es lo que probé:

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

e imprime yyyy-mm-dd.

Marcas.
fuente
1

Aquí se muestra cómo mostrar la fecha como (año / mes / día):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)
Adrian Simon
fuente
1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

esto imprimirá el 6-23-2018 si eso es lo que quieres :)

Erix
fuente
-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

De esta manera, puede obtener la fecha formateada como este ejemplo: 22-jun-2017

tanmayee
fuente
1
Demasiado código para algo que podría obtener en una línea. Con %busted obtendrá las primeras tres palabras del mes, y con %Btodo el mes. Ejemplo: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")regresará '2018-Oct-04 09:44:08'
Víctor López
-1

No entiendo completamente, pero puedo usarlo pandaspara obtener los tiempos en el formato correcto:

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

Y:

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

Pero está almacenando cadenas pero es fácil de convertir:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
U10-Adelante
fuente
44
¿Toda una dependencia para hacer algo que la biblioteca estándar de Python tiene métodos para hacer?
Hejazzman