Jak wydrukować datę w zwykłym formacie w Pythonie?

To jest mój kod:

import datetime
today = datetime.date.today()
print today
/ 2008-11-22 21: 00: 00...Mam listę, do której to dołączam i nagle wszystko staje się"nieciekawe". Oto kod:
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist

To drukuje:

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

Jak, u licha, mogę dostać prostą datę jak "2008-11-22"?

Author: NomadAlien, 2008-11-22

21 answers

Dlaczego: daty są obiektami

W Pythonie daty są obiektami. Dlatego, kiedy nimi manipulujesz, manipulujesz obiektami, nie ciągami znaków, nie znacznikami czasu ani niczym innym.

Każdy obiekt w Pythonie ma dwie reprezentacje łańcuchowe:

  • Regularną reprezentację używaną przez "print" można uzyskać za pomocą funkcji str(). Jest to najczęściej najpopularniejszy format czytelny dla człowieka i służy do łatwego wyświetlania. Więc str(datetime.datetime(2008, 11, 22, 19, 53, 42)) daje ci '2008-11-22 19:53:42'.

  • Alternatywna reprezentacja, która jest używana do reprezentowania natury obiektu (jako dane). Można go uzyskać za pomocą funkcji repr() i jest przydatny, aby wiedzieć, jakie dane manipulujesz podczas opracowywania lub debugowania. repr(datetime.datetime(2008, 11, 22, 19, 53, 42)) daje Ci 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Stało się to, że po wydrukowaniu daty za pomocą "Drukuj", użyto str(), abyś mógł zobaczyć ładny ciąg daty. Ale po wydrukowaniu mylist, Wydrukowano listę obiektów i Pythona próbowano reprezentować zbiór danych, używając repr().

Jak: co chcesz z tym zrobić?

Cóż, kiedy manipulujesz datami, używaj obiektów daty przez całą drogę. Mają tysiące użytecznych metod i większość API Pythona oczekuje, że daty będą obiektami.

Jeśli chcesz je wyświetlić, po prostu użyj str(). W Pythonie dobrą praktyką jest wyraźne rzucanie wszystkiego. Więc kiedy nadszedł czas, aby wydrukować, uzyskać ciąg reprezentacji daty za pomocą str(date).

Ostatnia rzecz. Kiedy próbowałeś wydrukować daty, wydrukowałeś mylist. Jeśli chcesz wydrukować datę, musisz wydrukować obiekty daty, a nie ich kontener (listę).

Np, chcesz wydrukować wszystkie daty na liście:

for date in mylist :
    print str(date)

Zauważ, że w tym konkretnym przypadku, możesz nawet pominąć str(), ponieważ print użyje go za Ciebie. Ale to nie powinno stać się nawykiem: -)

Praktyczny przypadek, używając kodu

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

Data zaawansowana formatowanie

Daty mają domyślną reprezentację, ale możesz chcieć wydrukować je w określonym formacie. W takim przypadku można uzyskać niestandardową reprezentację ciągu znaków za pomocą metody strftime().

strftime() oczekuje wzoru łańcucha wyjaśniającego, jak chcesz sformatować datę.

E. G:

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

Wszystkie litery po "%" reprezentują format czegoś :

  • %d jest liczbą dnia
  • %m to numer miesiąca
  • %b jest skrótem miesiąca
  • %y to dwa ostatnie cyfry roku
  • %Y jest cały rok

Etc

Spójrz na oficjalną dokumentację , lub McCutchen ' s quick reference {[88] } nie możesz znać ich wszystkich.

Od PEP3101 , każdy obiekt może mieć swój własny format używany automatycznie przez metodę format dowolnego ciągu znaków. W przypadku datetime format jest taki sam jak stosowany w strftime. Więc możesz zrobić to samo, co powyżej tak:

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

Zaletą tego formularza jest to, że można konwertować również inne obiekty w tym samym czasie.
Z wprowadzeniem sformatowanych literałów łańcuchowych (od Pythona 3.6, 2016-12-23) można to zapisać jako

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

Lokalizacja

Daty mogą automatycznie dostosowywać się do lokalnego języka i Kultury, jeśli używasz ich we właściwy sposób, ale jest to trochę skomplikowane. Może dla innego pytania na SO (Stack Overflow); -)

 781
Author: e-satis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 11:00:14
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Edit:

Po sugestii Cees też zacząłem używać czasu:

import time
print time.strftime("%Y-%m-%d %H:%M")
 254
Author: Daniel Magnusson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 12:54:59

Obiekty date, datetime i time obsługują metodę strftime (format) , aby utworzyć ciąg znaków reprezentujący czas pod kontrolą jawnego formatu sznurek.

Oto lista kodów formatu wraz z ich dyrektywą i znaczeniem.

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

Oto co możemy zrobić z modułami datetime i time w Pythonie

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

To wydrukuje coś takiego:

    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
 128
Author: Transformer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 14:26:14

Użyj daty.strftime. Argumenty formatowania są opisane w dokumentacji .

To jest to, czego chciałeś:

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

Ten bierze pod uwagę lokalizacje. (do this)

some_date.strftime('%c')
 66
Author: Ali Afshar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 09:06:54

To jest krótsze:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
 25
Author: Cees Timmerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 08:39:04
# 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)

Wyjście

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34
 22
Author: Waqas Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 08:24:34

Lub nawet

from datetime import datetime, date

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

Out: "25.12.2013

Lub

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

Out: "Dzisiaj - 25.12.2013"

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

Out: 'Wednesday'

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

Out: '_ _ main _ _ _ _ 2014.06.09_ _ 16-56.log"

 20
Author: nk9,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 13:58:31

Prosta odpowiedź-

datetime.date.today().isoformat()
 8
Author: Flame of udun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 13:23:22

Ze specyficznym typemdatetime formatowanie łańcuchów (Zobacz odpowiedź nk9 za pomocą str.format(). w Pythonie 3.6, 2016-12-23):

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

Dyrektywy formatu daty / czasu nie są dokumentowane jako część składni ciągu znaków formatu , ale raczej w date, datetime, i time's strftime() dokumentacja. Są one oparte na standardzie C z 1989 roku, ale zawierają niektóre dyrektywy ISO 8601 od Pythona 3.6.

 3
Author: handle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 13:07:26

Musisz przekonwertować obiekt Date time na łańcuch znaków.

Następujący kod zadziałał dla mnie:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection
Daj znać, jeśli będziesz potrzebował pomocy.
 2
Author: Simon Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-22 18:45:00

Możesz dołączyć go jako ciąg znaków?

import datetime 
mylist = [] 
today = str(datetime.date.today())
mylist.append(today) 
print mylist
 1
Author: HanClinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-22 18:45:26

Możesz zrobić:

mylist.append(str(today))
 1
Author: Igal Serban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-22 18:46:05
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

To wydrukuje 6-23-2018 jeśli tego chcesz:)

 1
Author: Erix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-23 06:37:32

Biorąc pod uwagę fakt, że prosiłeś o coś prostego, aby zrobić to, co chciałeś, możesz po prostu:

import datetime
str(datetime.date.today())
 1
Author: Ward Taye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 14:10:43

Ponieważ print today zwraca to, co chcesz, oznacza to, że funkcja __str__ today obiektu zwraca szukany łańcuch znaków.

Więc ty też możesz to zrobić.
 0
Author: Ismail Elouafiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-18 08:59:25

Możesz użyć easy_date aby to ułatwić:

import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
 0
Author: Raphael Amoedo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-10 05:32:55

Szybkie zastrzeżenie dla mojej odpowiedzi - uczę się Pythona dopiero od około 2 tygodni, więc w żadnym wypadku nie jestem ekspertem; dlatego moje wyjaśnienie może nie być najlepsze i mogę używać błędnej terminologii. W każdym razie, zaczyna się.

Zauważyłem w Twoim kodzie, że kiedy zadeklarowałeś swoją zmienną today = datetime.date.today() Wybrałeś nazwę zmiennej nazwą wbudowanej funkcji.

Kiedy następna linijka kodu mylist.append(today) dołączyła Twoją listę, dodała cały łańcuch datetime.date.today(), który miałeś wcześniej ustawiona jako wartość zmiennej today, a nie tylko dodawanie today().

Prostym rozwiązaniem, choć może nie takim, którego większość programistów użyłaby podczas pracy z modułem datetime, jest zmiana nazwy zmiennej.

Oto co próbowałem:

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

I drukuje yyyy-mm-dd.

 0
Author: Mark S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 03:38:54

Oto Jak wyświetlić datę jako (Rok / Miesiąc/Dzień):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)
 0
Author: Adrian Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-19 00:06:59

Nienawidzę pomysłu importowania zbyt wielu modułów dla wygody. Wolałbym raczej pracować z dostępnym modułem, który w tym przypadku jest datetime, niż wywoływać nowy moduł time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
 0
Author: rickydj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 20:37:29

Nie do końca rozumiem, ale, można użyć pandas do uzyskania czasów w odpowiednim formacie:

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

I:

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

Ale przechowuje ciągi, ale łatwo je konwertować:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
 0
Author: U9-Forward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-07 06:17:50
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

W ten sposób możesz sformatować datę w następujący sposób: 22-Jun-2017

 -1
Author: tanmayee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 05:26:45