Jak wydrukować datę w zwykłym formacie?


682

To jest mój kod:

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

To drukuje: 2008-11-22dokładnie tego chcę.

Ale mam listę, do której ją dołączam, a potem nagle wszystko staje się „dziwne”. Oto kod:

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

Spowoduje to wydrukowanie następujących elementów:

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

Jak mogę uzyskać prostą randkę, na przykład 2008-11-22?


13
Krótka odpowiedź: poprzez zastosowanie str()(do każdego elementu listy), ponieważ właśnie to printpośrednio zrobiło z twoim todayobiektem solo .
Lutz Prechelt

Odpowiedzi:


947

DLACZEGO: daty są obiektami

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

Każdy obiekt w Pythonie ma DWIE reprezentacje ciągu:

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

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

Stało się tak, że kiedy wydrukowałeś datę za pomocą „print”, użyłeś jej str(), abyś mógł zobaczyć ładny ciąg daty. Ale po wydrukowaniu mylistwydrukowałeś listę obiektów, a Python próbował reprezentować zestaw danych, używając repr().

Jak: co chcesz z tym zrobić?

Cóż, manipulując datami, używaj obiektów daty przez całą drogę. Dostali tysiące przydatnych metod, a większość API Pythona oczekuje, że daty będą obiektami.

Kiedy chcesz je wyświetlić, po prostu użyj str(). W Pythonie dobrą praktyką jest jawne rzucanie wszystkim. Więc kiedy nadejdzie czas drukowania, uzyskaj ciąg reprezentujący datę za pomocą str(date).

Ostatnia rzecz. Podczas próby wydrukowania dat wydrukowano mylist. Jeśli chcesz wydrukować datę, musisz wydrukować obiekty daty, a nie ich kontener (listę).

Np. Chcesz wydrukować całą datę na liście:

for date in mylist :
    print str(date)

Pamiętaj, ż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 twojego 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

Zaawansowane formatowanie daty

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

strftime() oczekuje wzorca ciągu wyjaśniającego, jak chcesz sformatować datę.

EG:

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

Cała litera po znaku "%"reprezentuje format czegoś:

  • %d to numer dnia
  • %m to numer miesiąca
  • %b to skrót miesiąca
  • %y to rok z ostatnich dwóch cyfr
  • %Y jest cały rok

itp

Zajrzyj do oficjalnej dokumentacji lub krótkiej informacji McCutchen, że nie znasz ich wszystkich.

Od wersji PEP3101 każdy obiekt może mieć własny format używany automatycznie przez format metody dowolnego łańcucha. W przypadku daty i godziny format jest taki sam, jak w strftime. Możesz więc zrobić to samo, co powyżej:

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

Zaletą tego formularza jest to, że można również konwertować inne obiekty w tym samym czasie.
Wraz z wprowadzeniem sformatowanych literałów łańcuchowych (od Python 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żyjesz ich we właściwy sposób, ale jest to trochę skomplikowane. Może inne pytanie dotyczące SO (przepełnienie stosu) ;-)


3
BTW Prawie każdy typ danych w pythonie jest klasą (oprócz niezmiennych, ale można je
podklasować

1
Co masz na myśli mówiąc „prawie”? str i int mają atrybut klasy , który zawiera „typ”, dlatego istnieją same klasy, ponieważ są instancjami typu metaklasa.
e-satis,

4
To jest dokładnie kwestia terminologii: typ! = Klasa ?, tj. Czy wystarczy mieć atrybut typu (podać mechanizm wnioskowania typu, aby kwalifikować się do obiektu), czy też jednostka powinna zachowywać się jak obiekt. Próbuję rozwiązać ten problem dla siebie tutaj programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich

1
Jeśli jesteś instancją klasy, jesteś obiektem. Dlaczego miałbyś być bardziej skomplikowany?
e-satis,

9
Każda wartość w Pythonie jest obiektem. Każdy obiekt ma swój typ. „type” == „class” formalnie (zobacz także, inspect.isclassaby się upewnić). Ludzie zwykle mówią „typ” dla wbudowanych i „klasa” dla reszty, ale to nie jest ważne
Kos

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

Edytować:

Po sugestii Cees zacząłem również używać czasu:

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

6
datetime.datetime?
Cees Timmerman,

2
Możesz użyć z datetime import datetime, a następnie print datetime().now().strftime("%Y-%m-%d %H:%M"). Tylko różnica w składni.
Daniel Magnusson,

7
from datetime import date; date.today().strftime("%Y-%m-%d")nadal wydaje mi się mało mityczny, ale bez tego jest najlepszy import time. Myślę, że moduł datetime służy do matematyki dat.
Cees Timmerman,

2
moim ulubionym jest from datetime import datetime as dti teraz możemy się bawićdt.now()
diewland

164

Obiekty date, datetime i time obsługują metodę strftime (format) w celu utworzenia ciągu reprezentującego czas pod kontrolą jawnego ciągu formatu.

Oto lista kodów formatów wraz z ich wytycznymi i znaczeniem.

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

To właśnie 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

1
To rozwiązało mój problem, w którym „bardziej uprzywilejowane odpowiedzi” nie. Ale mój problem był inny niż PO. Chciałem, żeby miesiące były drukowane jako tekst („luty” zamiast „2”)
Nathan

73

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

To jest to, czego chciałeś:

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

Ten uwzględnia ustawienia regionalne. (Zrób to)

some_date.strftime('%c')


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)

WYNIK

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34

25

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: „Today - 25.12.2013”

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

Out: „środa”

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

Out: „__main ____ 2014.06.09__16-56.log”



8

Z datetimeformatowaniem ciągów specyficznych dla typu (patrz odpowiedź nk9 przy użyciu str.format().) W sformatowanym dosłownym łańcuchu znaków (od Python 3.6, 2016-12-23):

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

Dyrektywy format daty / godziny nie są udokumentowane jako część formacie String Składnia ale raczej date, datetimei timejest strftime()dokumentacja. Są one oparte na standardzie C z 1989 roku, ale zawierają niektóre dyrektywy ISO 8601 od Pythona 3.6.


Pamiętaj, że dodałem te informacje do zaakceptowanej odpowiedzi .
uchwyt

Strftime tak naprawdę nie zawiera „wyjścia ISO 8601”. Istnieją „dyrektywy”, ale tylko dla określonych tokenów, takich jak „dzień tygodnia”, a nie cały znacznik czasu ISO 8601, co zawsze mnie denerwowało.
anarcat

5

Musisz przekonwertować obiekt daty i godziny na ciąg.

Poniższy kod działał dla mnie:

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

Daj mi znać, jeśli będziesz potrzebować dodatkowej pomocy.


3
Daj spokój ! Nie zachęcaj początkującego do przechowywania ciągu zamiast obiektu daty. Nie będzie wiedział, kiedy jest to dobry, czy zły pomysł ...
e-satis,

e-satis: Jeśli wszystko, czego potrzebujesz, to sznurek, o co chodzi? Daty kompilacji oprogramowania układowego przechowujemy przez cały czas jako ciągi znaków - czasem przechowywanie całego obiektu jest nadmierne, gdy wszystko, czego potrzebujesz, to prosty znacznik czasu (YAGNI i wszystkie).
HanClinto

3
Tak, w niektórych przypadkach tak jest. Mam na myśli, że nowicjusz nie będzie w stanie zidentyfikować tych przypadków. Zacznijmy więc od właściwej stopy :-)
e-satis

4

Nienawidzę pomysłu importowania zbyt wielu modułów dla wygody. Wolę pracować z dostępnym modułem, który w tym przypadku jest datetimeraczej niż wywoływanie nowego modułu time.

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

1
Myślę, że bardziej efektywne byłoby zrobienie tego w jednym wierszu kodua = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore


3

Biorąc pod uwagę fakt, że poprosiłeś o coś prostego do zrobienia, co chcesz, możesz po prostu:

import datetime
str(datetime.date.today())

3

Dla tych, którzy chcą daty opartej na ustawieniach regionalnych i nie zawierają godziny, użyj:

>>> some_date.strftime('%x')
07/11/2019

2

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

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

2

Ponieważ print todayzwraca to, co chcesz, oznacza to, że dzisiejszy obiekt__str__ funkcja ciąg.

Więc możesz to zrobić mylist.append(today.__str__()).



1

Szybkie zrzeczenie się mojej odpowiedzi - uczę się języka Python od około 2 tygodni, więc nie jestem ekspertem; dlatego moje wyjaśnienie może nie być najlepsze i mogę użyć niewłaściwej terminologii. W każdym razie, proszę bardzo.

Zauważyłem w twoim kodzie, że kiedy zadeklarowałeś zmienną today = datetime.date.today(), zdecydowałeś się nazwać ją zmienną nazwą wbudowanej funkcji.

Kiedy następny wiersz kodu mylist.append(today)dopisał twoją listę, dopisał cały ciąg datetime.date.today(), który wcześniej ustawiłeś jako wartość swojej todayzmiennej, a nie tylko dołączająctoday() .

Prostym rozwiązaniem, choć może nie jednym, 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.


1

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)

1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

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


-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

W ten sposób możesz sformatować datę tak jak w tym przykładzie: 22 czerwca 2017 r


1
Za dużo kodu na coś, co można uzyskać w jednym wierszu. Dzięki %bniemu otrzymasz pierwsze trzy miesiące słów i %Bcały miesiąc. Przykład: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")zwróci „2018-paź-04 09:44:08”
Víctor López

-1

Nie do końca rozumiem, ale mogę użyć pandasdo uzyskania czasu we właściwym 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 przekonwertować:

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

4
Cała zależność od zrobienia czegoś biblioteka std Pythona ma metody do zrobienia?
Hejazzman
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.