Comment imprimer une date dans un format régulier?

683

Voici mon code:

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

Cela imprime: 2008-11-22c'est exactement ce que je veux.

Mais, j'ai une liste à laquelle j'ajoute cela, puis tout à coup, tout devient "bancal". Voici le code:

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

Cela imprime les éléments suivants:

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

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

NomadAlien
la source
13
La réponse courte: en appliquant str()(à chaque élément de la liste), car c'est exactement ce qui a printimplicitement fait pour votre todayobjet solo .
Lutz Prechelt

Réponses:

949

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 en Python a DEUX représentations de chaîne:

  • La représentation régulière utilisée par "print" peut être obtenue en utilisant la str()fonction. C'est la plupart du temps le format lisible par l'homme le plus courant et est utilisé pour faciliter l'affichage. str(datetime.datetime(2008, 11, 22, 19, 53, 42))Vous donne donc '2008-11-22 19:53:42'.

  • Représentation alternative utilisée pour représenter la nature de l'objet (sous forme de données). Il peut être utile d'utiliser la repr()fonction et est pratique pour savoir quel type de données vous manipulez pendant que vous développez ou déboguez. 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 a utilisé str()pour que vous puissiez voir une belle chaîne de date. Mais lorsque vous avez imprimé mylist, vous avez imprimé une liste d'objets et Python a essayé de représenter l'ensemble de données à l'aide de repr().

Le Comment: que voulez-vous en faire?

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

Lorsque vous souhaitez les afficher, utilisez simplement str(). En Python, la bonne pratique consiste à 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, pas leur conteneur (la liste).

EG, vous voulez imprimer toute la date dans une liste:

for date in mylist :
    print str(date)

Notez que dans ce cas spécifique , vous pouvez même l'omettre str()car print l'utilisera pour vous. 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 souhaiterez peut-être 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 strftime()méthode.

strftime() attend un modèle 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'

Toutes les lettres après un "%"représentent 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 toute l'année

etc

Jetez un œil à la documentation officielle ou à la référence rapide de McCutchen, vous ne pouvez pas tous les connaître.

Depuis PEP3101 , chaque objet peut avoir son propre format utilisé automatiquement par le format de méthode de n'importe quelle chaîne. Dans le cas du datetime, le format est le même que celui utilisé dans strftime. Vous pouvez donc faire la même chose que ci-dessus comme ceci:

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 des littéraux de chaîne formatés (depuis Python 3.6, 2016-12-23), cela peut être écrit comme

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

Localisation

Les dates peuvent s'adapter automatiquement à 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) ;-)

e-satis
la source
3
BTW Presque tous les types de données en python sont une classe (sauf les immuables, mais ils peuvent être sous- classés
Yauhen Yakimovich
1
Que voulez-vous dire "presque"? str et int ont un attribut de classe , qui contient 'type', donc il y a classe lui-même, car ce sont des instances de métaclasse de type.
e-satis
4
C'est exactement la question de la terminologie: type! = Classe?, C'est-à-dire qu'il suffit d'avoir un attribut type (fournir un mécanisme d'inférence de type pour être qualifié pour un objet) ou si l'entité doit se comporter comme un objet. J'essaie de résoudre ce problème pour moi ici programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich
1
Si vous êtes une instance d'une classe, vous êtes un objet. Pourquoi auriez-vous besoin que ce soit plus compliqué?
e-satis
9
Chaque valeur en Python est un objet. Chaque objet a un type. "type" == "classe" formellement (voir aussi inspect.isclasspour vous en assurer). Les gens ont tendance à dire "type" pour les éléments intégrés et "classe" pour le reste, mais ce n'est pas important
Kos
341
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Éditer:

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

import time
print time.strftime("%Y-%m-%d %H:%M")
Daniel Magnusson
la source
6
datetime.datetime?
Cees Timmerman
2
Vous pouvez utiliser à partir de datetime import datetime, puis print datetime().now().strftime("%Y-%m-%d %H:%M"). Seulement une différence de syntaxe.
Daniel Magnusson
7
from datetime import date; date.today().strftime("%Y-%m-%d")me semble toujours impythonique, mais c'est le meilleur sans import time. Je pense que le module datetime est pour les mathématiques de date.
Cees Timmerman
2
mon préféré est from datetime import datetime as dtet maintenant nous pouvons jouer avecdt.now()
diewland
165

Les objets date, datetime et time 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  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.

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

Cela imprimera quelque chose comme ceci:

    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
Transformateur
la source
1
Cela a résolu mon problème là où les «réponses les plus positives» ne l'ont pas été. Mais mon problème était différent de celui des PO. Je voulais des mois imprimés en texte ("février" plutôt que "2")
Nathan
73

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

Celui-ci est ce que vous vouliez:

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

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

some_date.strftime('%c')
Ali Afshar
la source
36

C'est plus court:

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

PRODUCTION

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

Ou même

from datetime import datetime, date

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

Sortie: '25 .12.2013

ou

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

Sortie: 'Aujourd'hui - 25.12.2013'

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

Sortie: «mercredi»

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

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

b1_
la source
14

Réponse simple -

datetime.date.today().isoformat()
Flamme d'udun
la source
8

Avec un datetimeformatage de chaîne spécifique au type (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és dans le cadre de la chaîne de format de syntaxe , mais plutôt date, datetimeet timede » strftime()la documentation. Ils sont basés sur la norme C de 1989, mais incluent certaines directives ISO 8601 depuis Python 3.6.

manipuler
la source
Notez que j'ai également ajouté ces informations à la réponse acceptée .
gérer
strftime n'inclut pas vraiment de "sortie ISO 8601". Il y a des "directives", mais seulement pour des jetons spécifiques comme "jour de la semaine", pas un horodatage ISO 8601 entier, que j'ai toujours trouvé ennuyeux.
anarcat
5

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 d'aide.

Simon Johnson
la source
3
Allons ! N'encouragez pas un débutant à stocker une chaîne au lieu d'un objet date. Il ne pourra pas savoir quand c'est une bonne ou une mauvaise idée ...
e-satis
e-satis: Si vous n'avez besoin que d'une chaîne, quel est le problème? Nous stockons nos dates de construction de firmware sous forme de chaînes tout le temps - parfois, le stockage d'un objet entier est exagéré lorsque tout ce dont vous avez besoin est un simple horodatage (YAGNI et tout).
HanClinto
3
Oui, dans certains cas c'est le cas. Je veux juste dire qu'un simple débutant ne pourra pas identifier ces cas. Commençons donc avec le bon pied :-)
e-satis
4

Je déteste l'idée d'importer trop de modules pour plus de commodité. Je préfère travailler avec le module disponible qui dans ce cas est datetimeplutô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'
rickydj
la source
1
Je pense qu'il serait plus efficace de le faire dans une seule ligne de code en faisanta = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore
3

Tu peux faire:

mylist.append(str(today))
Igal Serban
la source
3

Compte tenu du fait que vous avez demandé quelque chose de simple pour faire ce que vous vouliez, vous pouvez simplement:

import datetime
str(datetime.date.today())
Ward Taya
la source
3

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

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

Vous pouvez l'ajouter en tant que chaîne?

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

Puisque le print todayretourne ce que vous voulez, cela signifie que la __str__fonction de l'objet d'aujourd'hui renvoie la chaîne que vous recherchez.

Vous pouvez donc faire mylist.append(today.__str__())de même.

Ismail Elouafiq
la source
1

Vous pouvez utiliser easy_date pour simplifier:

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

Un avertissement rapide pour ma réponse - je n'apprends le Python que depuis environ 2 semaines, donc je ne suis en aucun cas un expert; par conséquent, mon explication n'est peut-être pas la meilleure et je peux utiliser une terminologie incorrecte. Bref, c'est parti.

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 prochaine ligne de code a mylist.append(today)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 todayvariable, plutôt que d'ajouter simplementtoday() .

Une solution simple, bien que peut-être pas celle que la plupart des codeurs utiliseraient pour travailler avec le module datetime, est de 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.

Des marques.
la source
1

Voici comment afficher la date au format (année / mois / jour):

from datetime import datetime
now = datetime.now()

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

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

Erix
la source
-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 cette façon, vous pouvez obtenir la date formatée comme cet exemple: 22-Jun-2017

tanmayee
la source
1
Trop de code pour quelque chose que vous pourriez obtenir sur une seule ligne. Avec %bvous, vous obtiendrez les premiers mots de trois mois, et avec %Ble mois entier. Exemple: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")retournera '2018-oct-04 09:44:08'
Víctor López
-1

Je ne comprends pas tout à fait, mais je peux utiliser pandaspour 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 il stocke des chaînes mais est facile à convertir:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
U10-Forward
la source
4
Toute une dépendance pour faire quelque chose La bibliothèque python std a des méthodes à faire?
Hejazzman