Obteniendo la fecha de hoy en AAAA-MM-DD en Python?


326

Estoy usando:

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

para devolver la fecha de hoy en el YYYY-MM-DDformato.

¿Hay una manera menos cruda de lograr esto?


3
¿Qué quieres decir con "crudo"?
Gombat

44
¿tal vez esto? \ n now = datetime.datetime.now () \ n str (now.strftime ("Y-% m-% d")
Gombat

3
@Gombat Lo que quiero decir es que en mi experiencia, por lo general hay una construida en la forma de conseguir lo que queremos en Python sin tener que dividir, índice, concat, etc. unirse a
Pyderman

Respuestas:


604

Puedes usar strftime :

from datetime import datetime

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

Además, para cualquiera que también busque una hora, minuto y segundo con relleno cero al final: (Comentario de Gabriel Staples )

datetime.today().strftime('%Y-%m-%d-%H:%M:%S')

también hay una gran probabilidad de que "% x" funcione ... pero eso depende del entorno local
Joran Beasley, del

19
Para cualquiera que también busque una hora, minuto y segundo sin relleno al final:datetime.datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
Gabriel Staples

¿qué tal solo time.strftime("%Y-%m-%d")?
aderchox

Para la fecha UTC:datetime.utcnow().strftime('%Y-%m-%d')
Agost Biro

Vale la pena señalar que datetiene esto disponible, así comodatetime
dummyDev

116

Puede usar datetime.date.today()y convertir el datetime.dateobjeto resultante en una cadena:

from datetime import date
today = str(date.today())
print(today)   # '2017-12-26'

¿Es posible cambiar el separador a /?
Stevoisiak

3
@StevenVascellaro seríadate.today().strftime('%Y/%m/%d')
kmonsoor

2
@StevenVascellaro Mala idea. El lector normalmente asume el separador .a 'DMY', el separador /a M/D/Yy el separador -a Y-M-D. Aunque no todo el mundo sigue estas pautas, sería útil leer las fechas a nivel internacional siempre que no todos hayan cambiado Y-M-D.
glglgl

1
@glglgl Estoy trabajando con una API que asume el formato de fecha estadounidense m / d / a. Ya he cambiado el orden en mi solicitud.
Stevoisiak

1
@glglgl Sí, estoy usando m / d / a
Stevoisiak

35

Datetime es simplemente encantador si te gusta recordar códigos divertidos. ¿No preferirías la simplicidad?

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

Este módulo es lo suficientemente inteligente como para entender lo que quieres decir .

Solo hazlo pip install arrow.

Anexo: En respuesta a aquellos que se ejercitan sobre esta respuesta, permítanme decir que la flecha representa uno de los enfoques alternativos para lidiar con las fechas en Python. Eso es principalmente lo que quise sugerir.


17
para una tarea simple como esta, ¿por qué usar otra biblioteca cuando la biblioteca integrada puede hacerlo de manera simple? Por supuesto, si el usuario necesita otra multitud de funciones relacionadas con {hora, fecha}, traer una nueva biblioteca tiene sentido.
kmonsoor

2
me hiciste reír al leer esa segunda línea de código. ¿Cómo es eso mejor que print(date.today())>> "2018-12-16"? lol y obtenga fácilmente los valores int t.year,t.month,t.day+1>> (2018, 12, 17) dónde t = date.today()y el hecho de que las personas no tienen que llamar a la flecha verde para decirles la hora. oh dios, esto es demasiado código para recordar ...
Charco

1
@ Charco: Hilarante.
Bill Bell

@kmonsoor ¿Cómo es import datetimediferente de import arrow? Seguro que hay uno incorporado, pero si arrowproporciona un formato más conveniente, ¿por qué no usarlo?
information_interchange

1
@information_interchange ya respondió su pregunta. Incorporado vs no. Si alguien necesita esas cosas extra, claro, ¿por qué no arrow? Pero, para muchos proyectos simples, es innecesario. Además, en muchos proyectos internos de la empresa, las personas deben obtener la aprobación para incluir nuevas bibliotecas.
kmonsoor

30

Siempre uso la isoformat()función para esto.

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

Tenga en cuenta que esto también funciona en objetos de fecha y hora si también necesita la hora en formato estándar.

from datetime import datetime
now = datetime.today().isoformat()
print(now) # '2018-12-05T11:15:55.126382'

15

Otras respuestas sugieren el uso de Python datetime.datetime, pero como dijo @Bill Bell, hay otras bibliotecas que ofrecen datetimeinterfaces más simples como servicio o como parte de un ecosistema más grande de API. Aquí hay dos bibliotecas que hacen que trabajar condatetimes muy simple.

PANDAS

Puedes usar pd.to_datetimedesde la biblioteca de pandas . Aquí hay varias opciones, dependiendo de lo que desea devolver.

import pandas as pd

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

Como un objeto de fecha y hora de Python ,

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

Como una cadena de fecha con formato,

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'

Para obtener solo la fecha de la marca de tiempo, llame al Timestamp.date.

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

Además to_datetime, puede crear una instancia directa de un Timestampobjeto usando,

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)

Si desea que su zona horaria Timestamp sea consciente, pase una zona horaria al tzargumento.

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

PÉNDULO

Si está trabajando con péndulo , hay algunas opciones interesantes. Puede obtener la marca de tiempo actual usando now()o la fecha de hoy usando 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'))

Además, también puede obtener tomorrow()o yesterday()la fecha directamente sin tener que hacer ninguna aritmética adicional 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'))

Hay varias opciones de formato disponibles.

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
¡Las buenas noticias también lo tienen los pandas!
ZygD

1
Este es realmente increíble, especialmente cuando uno está trabajando en pandas
loveR

pd.to_datetime (day) .date () es útil si está utilizando pandas y no desea convertir a str. ¡Gracias!
Brndn

4

Respuesta muy tardía, pero puedes usar:

import time
today = time.strftime("%Y-%m-%d")
# 2020-02-14

1
gracias, este es el más limpio.
Barbaros Özhan


-5

Prefiero esto, porque es simple, pero quizás de alguna manera ineficiente y con errores. Debe verificar el código de salida del comando de shell si desea un programa fuertemente a prueba de errores.

os.system('date +%Y-%m-%d')

44
Esto debe usarse solo con el propósito de verificar qué devolverá el comando de fecha del sistema, en lugar de formatear realmente una fecha. Esto es por varias razones, aparte de la comprobación del código de salida. 1. No es portátil. El comando de fecha en Windows establece la fecha 2. Ineficiente. Tiene que crear un shell completo, que luego tiene que analizar, encontrar y ejecutar el comando, devolver la salida y luego destruir ese shell 3. Es simplemente no pitónico: muestra que no conoce bibliotecas fundamentales bien conocidas, y también puede inducir a error a los recién llegados al idioma que ven ese código
Capitán Lepton el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.