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?


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

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'

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


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'

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'

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

1
dziękuję, to jest najczystsze.
Barbaros Özhan


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

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