Получение сегодняшней даты в YYYY-MM-DD в Python?

326

Я использую:

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

вернуть сегодняшнюю дату в YYYY-MM-DDформате.

Есть ли менее грубый способ добиться этого?

Pyderman
источник
3
Что ты имеешь в виду под "сырой"?
Гомбат
4
Может быть, это? \ n now = datetime.datetime.now () \ n str (now.strftime ("Y-% m-% d")
Гомбат,
3
@Gombat Что я имею в виду, по моему опыту, в Python обычно есть способ получить то, что нам нужно, без необходимости разбивать, индексировать, объединять, объединять и т. Д.
Pyderman

Ответы:

604

Вы можете использовать strftime :

from datetime import datetime

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

Кроме того, для тех, кто ищет ноль, минуты и секунды в конце: (Комментарий Габриэля Стейплса )

datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
diegueus9
источник
Существует также высокая вероятность того, что "% x" будет работать ... но это зависит от
региона
19
Для тех, кто ищет ноль, час и минуту в конце:datetime.datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
Габриэль Стейплз
как насчет просто time.strftime("%Y-%m-%d")?
aderchox
Для даты UTC:datetime.utcnow().strftime('%Y-%m-%d')
Agost Biro
Стоит отметить, что dateэто доступно, а такжеdatetime
dummyDev
116

Вы можете использовать datetime.date.today()и преобразовать полученный datetime.dateобъект в строку:

from datetime import date
today = str(date.today())
print(today)   # '2017-12-26'
kmonsoor
источник
Можно ли изменить разделитель на /?
Stevoisiak
3
@ SteveVascellaro это было быdate.today().strftime('%Y/%m/%d')
kmonsoor
2
@ StevenVascellaro Плохая идея. Читатель обычно принимает разделитель .на «DMY», разделитель /на M/D/Yи разделитель -на Y-M-D. Хотя не все следуют этим рекомендациям, это помогло бы читать даты на международном уровне, если не все переключились на них Y-M-D.
glglgl
1
@glglgl Я работаю с API, который предполагает американский формат даты м / д / у. Я уже изменил порядок в моей заявке.
Stevoisiak
1
@glglgl Да, я использую м / д / г
Stevoisiak
35

Datetime просто прекрасно, если вам нравится вспоминать смешные коды. Вы бы не предпочли простоту?

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

Этот модуль достаточно умен, чтобы понять, что вы имеете в виду .

Просто делай pip install arrow.

Приложение: Отвечая на вопрос тех, кто начал заниматься этим вопросом, позвольте мне сказать, что стрелка представляет один из альтернативных подходов к работе с датами в Python. Это в основном то, что я хотел предложить.

Билл Белл
источник
17
для такой простой задачи, как эта, зачем использовать другую библиотеку, если встроенная библиотека может сделать это так же просто. Конечно, если пользователю нужны другие функции, связанные с {time, date}, использование новой библиотеки имеет смысл.
kmonsoor
2
Вы заставили меня смеяться над чтением этой второй строки кода. как это лучше чем print(date.today())>> "2018-12-16" ?? LOL и легко получить значения INT t.year,t.month,t.day+1>> (2018, 12, 17), где t = date.today()и факт, люди не должны вызывать зеленую стрелку, чтобы сообщить им время. о боже, это слишком много кода, чтобы помнить ...
Лужа
1
@ Лужа: веселый.
Билл Белл
@ kmonsoor Чем import datetimeотличается от import arrow? Конечно, он встроен, но если он arrowпредоставляет более удобный формат, то почему бы не использовать его?
информацией
1
@information_interchange вы уже ответили на свой вопрос. Встроенный против нет. Если кому-то нужны эти дополнительные вещи, конечно, почему бы и нет arrow? Но для многих простых проектов это просто не нужно. Кроме того, во многих внутренних проектах компании необходимо получить разрешение на включение новых библиотек.
kmonsoor
30

Я всегда использую isoformat()функцию для этого.

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

Обратите внимание, что это также работает с объектами datetime, если вам нужно время в стандартном формате.

from datetime import datetime
now = datetime.today().isoformat()
print(now) # '2018-12-05T11:15:55.126382'
JDH
источник
15

Другие ответы предполагают использование python datetime.datetime, но, как сказал @Bill Bell, есть и другие библиотеки, которые предлагают более простые datetimeинтерфейсы либо как сервис, либо как часть более широкой экосистемы API. Вот две такие библиотеки, которые делают работу с datetimesочень простой.

PANDAS

Вы можете использовать pd.to_datetimeиз библиотеки панд . Здесь представлены различные варианты, в зависимости от того, что вы хотите вернуть.

import pandas as pd

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

Как объект даты и времени Python ,

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

Как отформатированная строка даты,

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'

Чтобы получить только дату из отметки времени, позвоните Timestamp.date.

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

Кроме того to_datetime, вы можете напрямую создать экземпляр Timestampобъекта, используя,

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)

Если вы хотите, чтобы ваш часовой пояс был известен, передайте часовой пояс tzаргументу.

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

МАЯТНИК

Если вы работаете с маятником , есть несколько интересных вариантов. Вы можете получить текущую метку времени now()или текущую дату 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'))

Кроме того, вы также можете получить tomorrow()или yesterday()свидание непосредственно, не делая никакой дополнительной арифметики 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'))

Доступны различные варианты форматирования.

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
источник
3
Отличная новость, у панд тоже есть!
ZygD
1
Это действительно потрясающе, особенно когда вы работаете над пандами
loveR
pd.to_datetime (day) .date () полезен, если вы используете панд и не хотите конвертировать в str. Спасибо!
Brndn
4

Очень поздний ответ, но вы можете использовать:

import time
today = time.strftime("%Y-%m-%d")
# 2020-02-14
CONvid19
источник
1
спасибо, это самый чистый.
Барбарос Ожан
2

Ты можешь использовать,

>>> from datetime import date
>>> date.today().__str__()
'2019-10-05'
Мохидин бен Мухаммед
источник
2
вероятно str(date.today()), все еще лучше
information_interchange
это копия этого ответа stackoverflow.com/a/47984538
Борис
-5

Я предпочитаю это, потому что это просто, но может быть как-то неэффективно и глючит. Вы должны проверить код завершения оболочки команды , если вы хотите сильно ошибки доказательства программы.

os.system('date +%Y-%m-%d')
plhn
источник
4
Это следует использовать только для проверки того, что будет возвращать команда системной даты, а не для форматирования даты. Это по нескольким причинам, кроме проверки кода выхода. 1. Не переносимый. Команда date в Windows устанавливает дату 2. Неэффективно. Он должен создать целую оболочку, которая затем должна проанализировать, найти и выполнить команду, вернуть выходные данные, а затем уничтожить эту оболочку 3. Это просто не пифонично - это показывает, что вы не знаете хорошо известные фундаментальные библиотеки, и может также ввести в заблуждение новичков в языке, который видит этот код
капитан Лептон