web-dev-qa-db-fra.com

Comment imprimer une date dans un format régulier?

Ceci est mon code:

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

Cela affiche: 2008-11-22 qui est exactement ce que je veux.

Mais, j’ajoute une liste à cette liste et, tout à coup, tout se passe "en vain". Voici le code:

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

Cela imprime ce qui suit:

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

Comment puis-je obtenir juste une date simple comme 2008-11-22?

621
NomadAlien

Le pourquoi: les dates sont des objets

En Python, les dates sont des objets. Par conséquent, lorsque vous les manipulez, vous manipulez des objets, pas des chaînes, ni des horodatages, ni rien.

Tout objet dans Python a deux représentations de chaîne:

  • La représentation normale utilisée par "print" peut être obtenue en utilisant la fonction str(). Il s’agit le plus souvent du format lisible par l’homme et est utilisé pour faciliter l’affichage. Donc, str(datetime.datetime(2008, 11, 22, 19, 53, 42)) vous donne '2008-11-22 19:53:42'.

  • La représentation alternative utilisée pour représenter la nature de l'objet (en tant que données). Il peut être obtenu à l'aide de la fonction repr() et est pratique pour savoir quel type de données vous manipulez pendant le développement ou le débogage. repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) vous donne 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Ce qui s’est passé, c’est que lorsque vous avez imprimé la date en utilisant "print", il utilisait str() afin que vous puissiez voir une chaîne de date Nice. Mais lorsque vous avez imprimé mylist, vous avez imprimé une liste d'objets et Python a tenté de représenter l'ensemble des données à l'aide de repr().

Le comment: que veux-tu faire avec ça?

Eh bien, lorsque vous manipulez des dates, continuez à utiliser les objets de date tout au long du chemin. Ils ont reçu des milliers de méthodes utiles et la plupart des Python API s'attendent à ce que les dates soient des objets.

Lorsque vous souhaitez les afficher, utilisez simplement str(). En Python, la bonne pratique est de tout convertir explicitement. Donc, juste au moment d’imprimer, obtenez une représentation sous forme de chaîne de votre date en utilisant str(date).

Une dernière chose. Lorsque vous avez essayé d'imprimer les dates, vous avez imprimé mylist. Si vous souhaitez imprimer une date, vous devez imprimer les objets de date et non leur conteneur (la liste).

E.G, vous souhaitez imprimer toute la date dans une liste:

for date in mylist :
    print str(date)

Notez que dans ce cas particulier , vous pouvez même omettre str(), car print utilisera Pour toi. Mais cela ne devrait pas devenir une habitude :-)

Cas pratique, en utilisant votre code

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

Formatage de date avancé

Les dates ont une représentation par défaut, mais vous pouvez les imprimer dans un format spécifique. Dans ce cas, vous pouvez obtenir une représentation de chaîne personnalisée à l'aide de la méthode strftime().

strftime() attend un motif de chaîne expliquant comment vous souhaitez formater votre date.

PAR EXEMPLE :

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

Toute la lettre après un "%" représente un format pour quelque chose:

  • %d est le numéro du jour
  • %m est le numéro du mois
  • %b est l'abréviation du mois
  • %y est l'année des deux derniers chiffres
  • %Y est l'année entière

etc

Consultez la documentation officielle , ou référence rapide de McCutchen vous ne pouvez pas les connaître tous.

Depuis PEP3101 , chaque objet peut avoir son propre format utilisé automatiquement par le format de méthode de toute chaîne. Dans le cas de la date/heure, le format est le même que celui utilisé dans strftime. Ainsi, vous pouvez faire comme ci-dessus:

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

L'avantage de ce formulaire est que vous pouvez également convertir d'autres objets en même temps.
Avec l'introduction de littéraux de chaîne formatés (depuis Python 3.6, 2016-12-23), cela peut être écrit ainsi:

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

Localisation

Les dates peuvent automatiquement s'adapter à la langue et à la culture locales si vous les utilisez correctement, mais c'est un peu compliqué. Peut-être pour une autre question sur SO (Stack Overflow) ;-)

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

Edit:

Après la suggestion de Cees, j'ai aussi commencé à utiliser le temps:

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

Les objets date, date et heure prennent tous en charge une méthode strftime (format) pour créer une chaîne représentant l'heure sous le contrôle d'une chaîne de format explicite.

Voici une liste des codes de format avec leur directive et leur signification.

    %a  Locale’s abbreviated weekday name.
    %A  Locale’s full weekday name.      
    %b  Locale’s abbreviated month name.     
    %B  Locale’s full month name.
    %c  Locale’s 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  Locale’s 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  Locale’s appropriate date representation.    
    %X  Locale’s 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.

C’est ce que nous pouvons faire avec les modules datetime et time de 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")

Cela va imprimer quelque chose comme ça:

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

Utilisez date.strftime. Les arguments de formatage sont décrits dans la documentation .

Celui-ci est ce que tu voulais:

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

Celui-ci prend en compte Locale. (fais ça)

some_date.strftime('%c')
72
Ali Afshar

C'est plus court:

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

SORTIE

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

Ou même

from datetime import datetime, date

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

Out: '25 .12.2013

ou

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

Out: 'Aujourd'hui - 25.12.2013'

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

Out: 'mercredi'

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

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

22
b1_

Réponse simple -

datetime.date.today().isoformat()
11
Flame of udun

Avec un formatage de chaîne spécifique au type datetime (voir la réponse de nk9 en utilisant str.format() .) Dans un littéral de chaîne formaté (depuis Python 3.6, 2016-12-23):

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

Les directives de format de date/heure ne sont pas documentées dans le cadre de la syntaxe de chaîne de formatage , mais plutôt dans date, datetime et time ' strftime() documentation. Elles sont basées sur la norme C de 1989, mais incluent des directives ISO 8601 depuis Python 3.6.

7
handle

Vous devez convertir l'objet date/heure en chaîne.

Le code suivant a fonctionné pour moi:

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

Faites-moi savoir si vous avez besoin de plus d'aide.

4
Simon Johnson

Je déteste l'idée d'importer trop de modules pour plus de commodité. Je préférerais travailler avec le module disponible, qui dans ce cas est datetime plutôt que d'appeler un nouveau module time.

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

Tu peux faire:

mylist.append(str(today))
2
Igal Serban

Étant donné que vous avez demandé quelque chose de simple pour faire ce que vous vouliez, vous pouvez simplement:

import datetime
str(datetime.date.today())
2
Ward Taya

Vous voudrez peut-être l'ajouter en tant que chaîne?

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

Pour ceux qui veulent basé sur les paramètres régionaux date et n'incluant pas l'heure, utilisez:

some_date.strftime('%x')
>>> 07/11/2019
1
Liran H
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

cela sera imprimé le 23/06/2018 si c'est ce que vous voulez :)

1
Erix

Puisque print today renvoie ce que vous voulez, cela signifie que la fonction __str__ de l'objet d'aujourd'hui renvoie la chaîne que vous recherchez.

Vous pouvez donc faire mylist.append(today.__str__()) également.

1
Ismail Elouafiq

Un rapide dédit de responsabilité pour ma réponse - Je n’apprends que Python depuis environ 2 semaines, je ne suis donc en aucun cas un expert; par conséquent, mon explication peut ne pas être la meilleure et je peux utiliser une terminologie incorrecte. Quoi qu'il en soit, voilà.

J'ai remarqué dans votre code que lorsque vous avez déclaré votre variable today = datetime.date.today(), vous avez choisi de nommer votre variable avec le nom d'une fonction intégrée.

Lorsque votre ligne suivante de code mylist.append(today) a ajouté votre liste, elle a ajouté la chaîne entière datetime.date.today(), que vous aviez précédemment définie comme valeur de votre variable today, plutôt que de simplement ajouter today().

Une solution simple, bien que la plupart des codeurs ne l'utilisent peut-être pas avec le module datetime, consiste à changer le nom de votre variable.

Voici ce que j'ai essayé:

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

et il imprime yyyy-mm-dd.

0
Mark S.

Je ne comprends pas très bien, mais je peux utiliser pandas pour obtenir des temps au bon format:

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

Et:

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

Mais c'est stocker des chaînes mais facile à convertir:

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

Voici comment afficher la date sous la forme (année/mois/jour):

from datetime import datetime
now = datetime.now()

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

Vous pouvez utiliser easy_date pour simplifier les choses:

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