Mostrar fecha y hora de Python sin tiempo

3 minutos de lectura

avatar de usuario de pythonhunter
cazador de pitones

Tengo una cadena de fecha y quiero convertirla al tipo de fecha:

he tratado de usar datetime.datetime.strptime con el formato que quiero pero me esta devolviendo el tiempo con la conversión.

when = alldates[int(daypos[0])]
print when, type(when)

then = datetime.datetime.strptime(when, '%Y-%m-%d')
print then, type(then)

Esto es lo que devuelve la salida:

2013-05-07 <type 'str'>
2013-05-07 00:00:00 <type 'datetime.datetime'>

Necesito quitar el tiempo: 00:00:00.

print then.date()

Lo que quieres es un objeto datetime.date. Lo que tienes es un objeto datetime.datetime. Puede cambiar el objeto cuando imprima como se indicó anteriormente, o hacer lo siguiente al crear el objeto:

then = datetime.datetime.strptime(when, '%Y-%m-%d').date()

  • Busque aquí para mantener el formato de fecha y hora: enlace

    – Carsten

    30 de julio de 2019 a las 7:31

avatar de usuario de ukrutt
ukrutt

Si necesita que el resultado tenga en cuenta la zona horaria, puede usar el replace() método de datetime objetos. Esto conserva la zona horaria, por lo que puede hacer

>>> from django.utils import timezone
>>> now = timezone.now()
>>> now
datetime.datetime(2018, 8, 30, 14, 15, 43, 726252, tzinfo=<UTC>)
>>> now.replace(hour=0, minute=0, second=0, microsecond=0)
datetime.datetime(2018, 8, 30, 0, 0, tzinfo=<UTC>)

Tenga en cuenta que esto devuelve un nuevo objeto de fecha y hora — now permanece sin cambios.

>>> print then.date(), type(then.date())
2013-05-07 <type 'datetime.date'>

Para convertir una cadena en una fecha, la forma más fácil AFAIK es el módulo dateutil:

import dateutil.parser
datetime_object = dateutil.parser.parse("2013-05-07")

También puede manejar zonas horarias:

print(dateutil.parser.parse("2013-05-07"))
>>> datetime.datetime(2013, 5, 7, 1, 12, 12, tzinfo=tzutc())

Si tiene un objeto de fecha y hora, diga:

import pytz
import datetime
now = datetime.datetime.now(pytz.UTC)

y desea cortar la parte de tiempo, entonces creo que es más fácil construir un nuevo objeto en lugar de “sustraer la parte de tiempo”. Es más corto y más a prueba de balas:

date_part datetime.datetime(now.year, now.month, now.day, tzinfo=now.tzinfo)

También mantiene la información de la zona horaria, es más fácil de leer y comprender que una resta timedelta, y también tiene la opción de dar una zona horaria diferente en el mismo paso (lo cual tiene sentido, ya que tendrá una parte de tiempo cero de todos modos) .

Para mí, necesitaba MANTENER un objeto de tiempo porque estaba usando UTC y es un poco molesto. Entonces, esto es lo que terminé haciendo:

date = datetime.datetime.utcnow()

start_of_day = date - datetime.timedelta(
    hours=date.hour, 
    minutes=date.minute, 
    seconds=date.second, 
    microseconds=date.microsecond
)

end_of_day = start_of_day + datetime.timedelta(
    hours=23, 
    minutes=59, 
    seconds=59
)

Salida de ejemplo:

>>> date
datetime.datetime(2016, 10, 14, 17, 21, 5, 511600)
>>> start_of_day
datetime.datetime(2016, 10, 14, 0, 0)
>>> end_of_day
datetime.datetime(2016, 10, 14, 23, 59, 59)

Avatar de usuario de Chris
cris

Si desea específicamente un datetime y no un date pero quiero que el tiempo se ponga a cero, podrías combinar date con datetime.min.time()

Ejemplo:

datetime.datetime.combine(datetime.datetime.today().date(),
                          datetime.datetime.min.time())

Avatar de usuario de David Buck
David Buck

Puedes usar simplemente pd.to_datetime(then) y pandas convertirán los elementos de fecha en formato de fecha ISO- [YYYY-MM-DD].

Puede pasar esto como mapa/aplicar para usarlo también en un marco de datos/serie.

¿Ha sido útil esta solución?