To jest mój kod:
import datetime
today = datetime.date.today()
print(today)
To drukuje: 2008-11-22
dokł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
?
str()
(do każdego elementu listy), ponieważ właśnie toprint
pośrednio zrobiło z twoimtoday
obiektem solo .Odpowiedzi:
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ęcstr(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 wydrukowaniumylist
wydrukowałeś listę obiektów, a Python próbował reprezentować zestaw danych, używającrepr()
.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:
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
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:
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 rokitp
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:
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
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) ;-)
źródło
inspect.isclass
aby się upewnić). Ludzie zwykle mówią „typ” dla wbudowanych i „klasa” dla reszty, ale to nie jest ważneEdytować:
Po sugestii Cees zacząłem również używać czasu:
źródło
datetime.datetime
?datetime import datetime
, a następnieprint datetime().now().strftime("%Y-%m-%d %H:%M")
. Tylko różnica w składni.from datetime import date; date.today().strftime("%Y-%m-%d")
nadal wydaje mi się mało mityczny, ale bez tego jest najlepszyimport time
. Myślę, że moduł datetime służy do matematyki dat.from datetime import datetime as dt
i teraz możemy się bawićdt.now()
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.
To właśnie możemy zrobić z modułami datetime i time w Pythonie
To wydrukuje coś takiego:
źródło
Użyj date.strftime. Argumenty formatowania są opisane w dokumentacji .
To jest to, czego chciałeś:
Ten uwzględnia ustawienia regionalne. (Zrób to)
źródło
To jest krótsze:
źródło
źródło
Lub nawet
Out: '25 .12.2013
lub
Out: „Today - 25.12.2013”
Out: „środa”
Out: „__main ____ 2014.06.09__16-56.log”
źródło
Prosta odpowiedź -
źródło
Z
datetime
formatowaniem ciągów specyficznych dla typu (patrz odpowiedź nk9 przy użyciustr.format()
.) W sformatowanym dosłownym łańcuchu znaków (od Python 3.6, 2016-12-23):Dyrektywy format daty / godziny nie są udokumentowane jako część formacie String Składnia ale raczej
date
,datetime
itime
jeststrftime()
dokumentacja. Są one oparte na standardzie C z 1989 roku, ale zawierają niektóre dyrektywy ISO 8601 od Pythona 3.6.źródło
Musisz przekonwertować obiekt daty i godziny na ciąg.
Poniższy kod działał dla mnie:
Daj mi znać, jeśli będziesz potrzebować dodatkowej pomocy.
źródło
Nienawidzę pomysłu importowania zbyt wielu modułów dla wygody. Wolę pracować z dostępnym modułem, który w tym przypadku jest
datetime
raczej niż wywoływanie nowego modułutime
.źródło
a = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Możesz to zrobić:
źródło
Biorąc pod uwagę fakt, że poprosiłeś o coś prostego do zrobienia, co chcesz, możesz po prostu:
źródło
Dla tych, którzy chcą daty opartej na ustawieniach regionalnych i nie zawierają godziny, użyj:
źródło
Możesz dołączyć go jako ciąg?
źródło
Ponieważ
print today
zwraca to, co chcesz, oznacza to, że dzisiejszy obiekt__str__
funkcja ciąg.Więc możesz to zrobić
mylist.append(today.__str__())
.źródło
Aby ułatwić, możesz użyć easy_date :
źródło
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ągdatetime.date.today()
, który wcześniej ustawiłeś jako wartość swojejtoday
zmiennej, 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:
i drukuje
yyyy-mm-dd
.źródło
Oto jak wyświetlić datę jako (rok / miesiąc / dzień):
źródło
to wydrukuje 6-23-2018, jeśli tego chcesz :)
źródło
W ten sposób możesz sformatować datę tak jak w tym przykładzie: 22 czerwca 2017 r
źródło
%b
niemu otrzymasz pierwsze trzy miesiące słów i%B
cały miesiąc. Przykład:datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")
zwróci „2018-paź-04 09:44:08”Nie do końca rozumiem, ale mogę użyć
pandas
do uzyskania czasu we właściwym formacie:I:
Ale przechowuje ciągi, ale łatwo je przekonwertować:
źródło