Como imprimir uma data em um formato regular?

682

Este é o meu código:

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

Isso imprime: o 2008-11-22que é exatamente o que eu quero.

Mas, eu tenho uma lista à qual estou anexando isso e, de repente, tudo fica "instável". Aqui está o código:

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

Isso imprime o seguinte:

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

Como posso obter apenas um encontro simples 2008-11-22?

NomadAlien
fonte
13
A resposta curta: aplicando str()(a cada elemento da lista), porque foi exatamente isso que printimplicitamente fez com seu todayobjeto solo .
Lutz Prechelt 23/02

Respostas:

947

O porquê: datas são objetos

No Python, datas são objetos. Portanto, quando você os manipula, você manipula objetos, não seqüências de caracteres, nem timestamps nem nada.

Qualquer objeto no Python tem DUAS representações de string:

  • A representação regular usada por "print" pode ser obtida usando a str()função Na maioria das vezes, é o formato legível humano mais comum e é usado para facilitar a exibição. Então str(datetime.datetime(2008, 11, 22, 19, 53, 42))te dá '2008-11-22 19:53:42'.

  • A representação alternativa usada para representar a natureza do objeto (como dados). Pode ser usado com a repr()função e é útil saber que tipo de dados você está manipulando enquanto estiver desenvolvendo ou depurando. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))te dá 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

O que aconteceu foi que, quando você imprimiu a data usando "print", ela foi usada str()para que você pudesse ver uma boa sequência de datas. Mas quando você imprimiu mylist, você imprimiu uma lista de objetos e o Python tentou representar o conjunto de dados usando repr().

O Como: o que você quer fazer com isso?

Bem, quando você manipula datas, continue usando os objetos date o tempo todo. Eles têm milhares de métodos úteis e a maior parte da API Python espera que as datas sejam objetos.

Quando você quiser exibi-los, basta usar str(). No Python, a boa prática é converter tudo explicitamente. Portanto, na hora de imprimir, obtenha uma representação de string da sua data usando str(date).

Uma última coisa. Quando você tentou imprimir as datas, você imprimiu mylist. Se você deseja imprimir uma data, imprima os objetos de data, não o contêiner (a lista).

Por exemplo, você deseja imprimir toda a data em uma lista:

for date in mylist :
    print str(date)

Observe que , nesse caso específico , você pode até omitir, str()porque a impressão o utilizará para você. Mas não deve se tornar um hábito :-)

Caso prático, usando seu 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

Formatação avançada de data

As datas têm uma representação padrão, mas você pode imprimi-las em um formato específico. Nesse caso, você pode obter uma representação de string personalizada usando o strftime()método

strftime() espera um padrão de sequência explicando como você deseja formatar sua data.

POR EXEMPLO :

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

Toda a letra após a "%"representa um formato para algo:

  • %d é o número do dia
  • %m é o número do mês
  • %b é a abreviação do mês
  • %y é o ano nos últimos dois dígitos
  • %Y é o ano todo

etc

Dê uma olhada na documentação oficial , ou na referência rápida de McCutchen, você não pode conhecer todas elas.

Desde o PEP3101 , cada objeto pode ter seu próprio formato usado automaticamente pelo formato do método de qualquer sequência. No caso da data e hora, o formato é o mesmo usado no strftime. Então você pode fazer o mesmo que acima, desta forma:

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

A vantagem deste formulário é que você também pode converter outros objetos ao mesmo tempo.
Com a introdução de literais de cadeia de caracteres formatada (desde Python 3.6, 23/12/2016), isso pode ser escrito como

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

Localização

As datas podem se adaptar automaticamente ao idioma e cultura locais se você as usar da maneira certa, mas é um pouco complicado. Talvez para outra pergunta sobre SO (Stack Overflow) ;-)

e-satis
fonte
3
BTW Quase todos os tipos de dados em python é uma classe (exceto imutáveis, mas eles podem ser uma subclasse) stackoverflow.com/questions/865911/...
Yauhen Yakimovich
1
O que você quer dizer com "quase"? str e int têm um atributo de classe , que contém 'type'; portanto, existem classes em si mesmas, pois são instâncias do tipo metaclass.
e-satis
4
Essa é exatamente a questão da terminologia: type! = Class ?, ou seja, basta ter o atributo type (fornecer mecanismo de inferência de tipo para ser qualificado para um objeto) ou a entidade deve se comportar como um objeto. Estou tentando resolver isso sozinho aqui programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich 12/12/12 /
1
Se você é uma instância de uma classe, você é um objeto. Por que você precisaria que fosse mais complicado?
e-satis
9
Todo valor no Python é um objeto. Todo objeto tem um tipo. "type" == "class" formalmente (veja também inspect.isclasspara ter certeza). As pessoas tendem a dizer "tipo" para embutidos e "classe" para o resto, mas isso não é importante
Kos
340
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Editar:

Após a sugestão de Cees, comecei a usar o tempo também:

import time
print time.strftime("%Y-%m-%d %H:%M")
Daniel Magnusson
fonte
6
datetime.datetime?
amigos estão dizendo
2
Você pode usar from datetime import datetimee então print datetime().now().strftime("%Y-%m-%d %H:%M"). Apenas uma diferença de sintaxe.
precisa
7
from datetime import date; date.today().strftime("%Y-%m-%d")ainda me parece antitônico, mas é o melhor sem ele import time. Eu acho que o módulo datetime é para matemática de datas.
amigos estão dizendo
2
o meu favorito é from datetime import datetime as dte agora podemos jogar comdt.now()
diewland
164

Os objetos date, datetime e time suportam um método strftime (format), para criar uma sequência que representa a hora sob o controle de uma sequência explícita de formato.

Aqui está uma lista dos códigos de formato com sua diretiva e 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.

Isto é o que podemos fazer com os módulos datetime e time em 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")

Isso imprimirá algo como isto:

    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
fonte
1
Isso resolveu meu problema, onde as "respostas mais votadas" não. Mas meu problema era diferente dos POs. Queria meses impressos como texto ("fevereiro" em vez de "2")
Nathan
73

Use date.strftime. Os argumentos de formatação são descritos na documentação .

Este é o que você queria:

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

Este leva o Local em consideração. (faça isso)

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

Isso é mais curto:

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

RESULTADO

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

Ou até

from datetime import datetime, date

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

Fora: '25 .12.2013

ou

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

Fora: 'Hoje - 25.12.2013'

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

Fora: 'quarta-feira'

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

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

b1_
fonte
14

Resposta simples -

datetime.date.today().isoformat()
Chama de udun
fonte
8

Com datetimeformatação de sequência específica de tipo (consulte a resposta do nk9 usando str.format().) Em um literal de sequência de caracteres formatada (desde Python 3.6, 23-12-2016):

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

As directivas formato de data / hora não são documentados como parte do formato de seqüência de sintaxe , mas sim na date, datetimee timeda strftime()documentação. Eles são baseados no Padrão C de 1989, mas incluem algumas diretivas ISO 8601 desde o Python 3.6.

lidar com
fonte
Observe que também adicionei essas informações à resposta aceita .
manipula
O strftime não inclui realmente uma "saída ISO 8601". Existem "diretivas", mas apenas para tokens específicos como "dia da semana", não todo um registro de data e hora da ISO 8601, que eu sempre achei irritante.
Anarcat
5

Você precisa converter o objeto de data e hora em uma sequência.

O código a seguir funcionou para mim:

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

Entre em contato se precisar de mais ajuda.

Simon Johnson
fonte
3
Vamos ! Não incentive um novato a armazenar uma string em vez de um objeto de data. Ele não será capaz de saber quando é uma boa ou uma má idéia ...
e-satis
e-satis: se tudo o que você precisa é de uma corda, qual é o problema? Armazenamos nossas datas de construção de firmware como strings o tempo todo - às vezes, armazenar um objeto inteiro é um exagero quando tudo o que você precisa é de um carimbo de data / hora simples (YAGNI e tudo).
214 HanClinto
3
Sim, em certos casos é. Só quero dizer que apenas um novato não será capaz de identificar esses casos. Então, vamos começar com o pé direito :-)
e-satis
4

Odeio a ideia de importar muitos módulos por conveniência. Prefiro trabalhar com o módulo disponível, que neste caso é, em datetimevez de chamar um novo 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
fonte
1
Eu acho que seria mais eficiente de fazer isso em uma linha de código, fazendoa = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore
3

Você pode fazer:

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

Considerando o fato de que você pediu algo simples para fazer o que queria, você poderia apenas:

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

Para aqueles que desejam data com base no código do idioma e não incluem hora, use:

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

Você pode anexá-lo como uma string?

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

Como print todayretorna o que você deseja, isso significa que a __str__função do objeto today retorna a string que você está procurando.

Então você pode fazer mylist.append(today.__str__())também.

Ismail Elouafiq
fonte
1

Você pode usar easy_date para facilitar:

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

Um aviso rápido para a minha resposta - eu só estou aprendendo Python há cerca de duas semanas, por isso não sou um especialista; portanto, minha explicação pode não ser a melhor e posso usar terminologia incorreta. Enfim, aqui vai.

Percebi no seu código que, quando você declarou sua variável, today = datetime.date.today()escolheu nomear sua variável com o nome de uma função interna.

Quando sua próxima linha de código mylist.append(today)anexou sua lista, ela anexou a cadeia inteira datetime.date.today(), que você definiu anteriormente como o valor da sua todayvariável, em vez de apenas anexá-la today().

Uma solução simples, embora talvez a maioria dos codificadores não usaria ao trabalhar com o módulo datetime, é alterar o nome da sua variável.

Aqui está o que eu tentei:

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

e imprime yyyy-mm-dd.

Mark S.
fonte
1

Aqui está como exibir a data como (ano / mês / dia):

from datetime import datetime
now = datetime.now()

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

isso será impresso em 23-06-2018 se é isso que você deseja :)

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

Dessa forma, você pode obter a data formatada como este exemplo: 22 de junho de 2017

tanmayee
fonte
1
Código em excesso para algo que você pode obter em uma linha. Com %bvocê obterá as primeiras palavras de três meses e com %Bo mês inteiro. Exemplo: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")retornará '2018-Oct-04 09:44:08'
Víctor López
-1

Não entendi completamente, mas posso usar pandaspara obter horários no formato certo:

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

Mas é armazenar strings, mas fácil de converter:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
Sub-10
fonte
4
Toda uma dependência para fazer algo python std library tem métodos para fazer?
precisa saber é o seguinte