Uzyskujesz dzisiejszą datę w RRRR-MM-DD w Pythonie?

325

Używam:

str(datetime.datetime.today()).split()[0]

zwrócić dzisiejszą datę w YYYY-MM-DD formacie.

Czy istnieje mniej prymitywny sposób na osiągnięcie tego?

Pyderman
źródło
3
Co masz na myśli mówiąc „prymitywny”?
Gombat
4
może to? \ n teraz = datetime.datetime.now () \ n str (now.strftime („Y-% m-% d”)
Gombat
3
@Gombat Mam na myśli to, co mam na myśli, zwykle jest to sposób na uzyskanie tego, co chcemy w Pythonie bez konieczności dzielenia, indeksowania, konkatacji, dołączania itp.
Pyderman

Odpowiedzi:

602

Możesz użyć strftime :

from datetime import datetime

datetime.today().strftime('%Y-%m-%d')

Dodatkowo, dla każdego, kto szuka zerowej godziny, minuty i sekundy na końcu: (komentarz: Gabriel Staples )

datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
diegueus9
źródło
istnieje również duże prawdopodobieństwo, że „% x” zadziała ... ale to zależy od ustawień regionalnych
Joran Beasley
19
Dla wszystkich, którzy szukają zerowej godziny, minuty i sekundy na końcu:datetime.datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
Gabriel Staples
Jak o właśnie time.strftime("%Y-%m-%d")?
aderchox
Dla daty UTC:datetime.utcnow().strftime('%Y-%m-%d')
Agost Biro,
Warto zauważyć, że datema to również dostępnedatetime
dummyDev
116

Możesz użyć datetime.date.today()i przekonwertować wynikowy datetime.dateobiekt na ciąg:

from datetime import date
today = str(date.today())
print(today)   # '2017-12-26'
kmonsoor
źródło
Czy można zmienić separator na /?
Stevoisiak
3
@StevenVascellaro byłobydate.today().strftime('%Y/%m/%d')
kmonsoor
2
@StevenVascellaro Zły pomysł. Czytnik zwykle przyjmuje separator .do „DMY”, separator /do M/D/Yi separator -do Y-M-D. Chociaż nie wszyscy przestrzegają tych wytycznych, pomogłoby to w czytaniu dat na arenie międzynarodowej, o ile nie wszyscy się na nie zmienili Y-M-D.
glglgl
1
@glglgl Pracuję z interfejsem, który przyjmuje amerykański format daty m / d / r. Już zmieniłem kolejność w mojej aplikacji.
Stevoisiak
1
@glglgl Tak, używam m / d / y
Stevoisiak
35

Datetime jest po prostu piękny, jeśli lubisz pamiętać śmieszne kody. Czy nie wolisz prostoty?

>>> import arrow
>>> arrow.now().format('YYYY-MM-DD')
'2017-02-17'

Ten moduł jest wystarczająco sprytny, aby zrozumieć, co masz na myśli .

Po prostu zrób pip install arrow .

Dodatek: W odpowiedzi na tych, którzy zastanawiają się nad tą odpowiedzią, powiem tylko, że strzałka reprezentuje jedno z alternatywnych podejść do radzenia sobie z datami w Pythonie. Właśnie to chciałem zasugerować.

Bill Bell
źródło
17
dla takiego prostego zadania, po co używać innej biblioteki, gdy wbudowana biblioteka może to zrobić tak prosto. Oczywiście, jeśli użytkownik potrzebuje innych mnóstwa funkcji związanych z {czas, data}, wprowadzenie nowej biblioteki ma sens.
kmonsoor
2
rozśmieszyłeś mnie, czytając ten drugi wiersz kodu. jak to jest lepsze niż print(date.today())>> „2018-12-16”? lol i łatwo uzyskaj wartości int t.year,t.month,t.day+1>> (2018, 12, 17) gdzie t = date.today()i fakt, że ludzie nie muszą dzwonić zieloną strzałką, aby powiedzieć im godzinę. o Boże, to jest za dużo kodu, żeby zapamiętać ...
Puddle
1
@Puddle: Zabawne.
Bill Bell
@kmonsoor Czym import datetimeróżni się od import arrow? Pewnie, że jest wbudowany, ale jeśliarrow zapewnia wygodniejszy format, dlaczego go nie użyć?
information_interchange
1
@information_interchange już odpowiedziałeś na swoje pytanie. Wbudowane a nie. Jeśli ktoś potrzebuje tych dodatkowych rzeczy, jasne, dlaczego nie arrow? Ale w przypadku wielu prostych projektów jest to po prostu niepotrzebne. Ponadto w wielu wewnętrznych projektach firmy ppl musi uzyskać zgodę na włączenie nowych bibliotek.
kmonsoor,
30

Zawsze używam isoformat()do tego funkcji.

from datetime import date    
today = date.today().isoformat()
print(today) # '2018-12-05'

Zauważ, że działa to również na obiektach datetime, jeśli potrzebujesz czasu również w standardowym formacie.

from datetime import datetime
now = datetime.today().isoformat()
print(now) # '2018-12-05T11:15:55.126382'
JdH
źródło
15

Inne odpowiedzi sugerują użycie pytona datetime.datetime, ale jak powiedział @Bill Bell, istnieją inne biblioteki, które oferują prostsze datetimeinterfejsy jako usługę lub jako część większego ekosystemu interfejsów API. Oto dwie takie biblioteki, z którymi można pracowaćdatetimes bardzo prostą.

PANDY

Możesz użyć pd.to_datetimez biblioteki pand . Oto różne opcje w zależności od tego, co chcesz zwrócić.

import pandas as pd

pd.to_datetime('today')  # pd.to_datetime('now')
# Timestamp('2019-03-27 00:00:10.958567')

Jako obiekt datetime w Pythonie

pd.to_datetime('today').to_pydatetime()
# datetime.datetime(2019, 4, 18, 3, 50, 42, 587629)

Jako sformatowany ciąg daty

pd.to_datetime('today').isoformat()
# '2019-04-18T04:03:32.493337'

# Or, `strftime` for custom formats.
pd.to_datetime('today').strftime('%Y-%m-%d')
# '2019-03-27'

Aby uzyskać tylko datę ze znacznika czasu, zadzwoń Timestamp.date.

pd.to_datetime('today').date()
# datetime.date(2019, 3, 27)

Poza to_datetimetym możesz bezpośrednio tworzyć instancję Timestampobiektu,

pd.Timestamp('today')  # pd.Timestamp('now')
# Timestamp('2019-04-18 03:43:33.233093')

pd.Timestamp('today').to_pydatetime()
# datetime.datetime(2019, 4, 18, 3, 53, 46, 220068)

Jeśli chcesz, aby strefa czasowa była świadoma, przekaż strefę czasową do tzargumentu.

pd.Timestamp('now', tz='America/Los_Angeles')
# Timestamp('2019-04-18 03:59:02.647819-0700', tz='America/Los_Angeles')

WAHADŁO

Jeśli pracujesz z wahadłem , istnieje kilka interesujących opcji. Możesz uzyskać bieżący znacznik czasu używając now()lub dzisiejszą datę używając today().

import pendulum 

pendulum.now()
# DateTime(2019, 3, 27, 0, 2, 41, 452264, tzinfo=Timezone('America/Los_Angeles'))

pendulum.today()
# DateTime(2019, 3, 27, 0, 0, 0, tzinfo=Timezone('America/Los_Angeles'))

Dodatkowo możesz również uzyskać tomorrow()lub yesterday()datę bezpośrednio, bez konieczności wykonywania dodatkowej arytmetyki timedelta.

pendulum.yesterday()
# DateTime(2019, 3, 26, 0, 0, 0, tzinfo=Timezone('America/Los_Angeles'))

pendulum.tomorrow()
# DateTime(2019, 3, 28, 0, 0, 0, tzinfo=Timezone('America/Los_Angeles'))

Dostępne są różne opcje formatowania.

pendulum.now().to_date_string()
# '2019-03-27'

pendulum.now().to_formatted_date_string()
# 'Mar 27, 2019'

pendulum.now().to_day_datetime_string()
# 'Wed, Mar 27, 2019 12:04 AM'
cs95
źródło
3
Świetne wiadomości pandy też to mają!
ZygD
1
Ten jest naprawdę niesamowity, szczególnie gdy pracujesz nad
pandami
pd.to_datetime (dzień) .date () jest przydatny, jeśli używasz pand i nie chcesz konwertować na str. Dzięki!
Brndn
4

Bardzo późna odpowiedź, ale możesz użyć:

import time
today = time.strftime("%Y-%m-%d")
# 2020-02-14
CONvid19
źródło
1
dziękuję, to jest najczystsze.
Barbaros Özhan
2

Możesz użyć,

>>> from datetime import date
>>> date.today().__str__()
'2019-10-05'
Mohideen bin Mohammed
źródło
2
prawdopodobnie str(date.today())jest jeszcze lepszy
information_interchange
to jest kopia tej odpowiedzi stackoverflow.com/a/47984538
Boris
-5

Wolę to, ponieważ jest to proste, ale może w jakiś sposób nieefektywne i błędne. Musisz sprawdzić kod zakończenia polecenia powłoki, jeśli chcesz program silnie odporny na błędy.

os.system('date +%Y-%m-%d')
plhn
źródło
4
Powinno to być używane wyłącznie w celu sprawdzenia, co zwróci polecenie systemowej daty, zamiast formatowania daty. Wynika to z kilku powodów oprócz sprawdzania kodu wyjścia. 1. Nie przenośny. Polecenie daty w systemie Windows ustawia datę 2. Nieefektywne. Musi utworzyć całą powłokę, która następnie musi przeanalizować, znaleźć i wykonać polecenie, zwrócić dane wyjściowe, a następnie zniszczyć tę powłokę 3. Jest po prostu niepythonic - pokazuje, że nie znasz dobrze znanych bibliotek podstawowych i może również wprowadzić nowych przybyszów w język, który widzi ten kod
Kapitan Lepton