horas - Cómo truncar la hora en un objeto DateTime en Python?
formato fecha python (10)
Cuatro años después: otra forma, evitar replace
Sé que la respuesta aceptada de hace cuatro años funciona, pero esto parece un poco más ligero que usar replace
:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Notas
- Cuando creas un objeto
datetime
sin pasar propiedades de tiempo al constructor, obtienes la medianoche. - Como otros han notado, esto supone que usted quiere un objeto datetime para su uso posterior con timedeltas.
- Puede, por supuesto, sustituir esto por la primera línea:
dt = datetime.datetime.now()
¿Cuál es una forma elegante de truncar un objeto python datetime?
En este caso particular, hasta el día. Así que, básicamente, establecer horas, minutos, segundos y microsegundos en 0.
Me gustaría que la salida también sea un objeto datetime, no una cadena.
¿Qué significa truncado?
Usted tiene control total sobre el formato utilizando el método strftime () y usando una cadena de formato apropiada.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
6 años después ... Encontré esta publicación y me gustó más el enfoque numpy:
import numpy as np
dates_array = np.array([''2013-01-01'', ''2013-01-15'', ''2013-01-30'']).astype(''datetime64[ns]'')
truncated_dates = dates_array.astype(''datetime64[D]'')
aclamaciones
Creo que esto es lo que estás buscando ...
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)
Pero si realmente no te importa el aspecto temporal de las cosas, entonces solo deberías estar pasando por objetos de date
...
>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
Hay un módulo datetime_truncate que maneja esto por usted. Simplemente llama a datetime.replace.
Hay una gran biblioteca utilizada para manipular las fechas: Delorean
import datetime
from delorean import Delorean
now = datetime.datetime.now()
d = Delorean(now, timezone=''US/Pacific)
>>> now
datetime.datetime(2015, 3, 26, 19, 46, 40, 525703)
>>> d.truncate(''second'')
Delorean(datetime=2015-03-26 19:46:40-07:00, timezone=US/Pacific)
>>> d.truncate(''minute'')
Delorean(datetime=2015-03-26 19:46:00-07:00, timezone=US/Pacific)
>>> d.truncate(''hour'')
Delorean(datetime=2015-03-26 19:00:00-07:00, timezone=US/Pacific)
>>> d.truncate(''day'')
Delorean(datetime=2015-03-26 00:00:00-07:00, timezone=US/Pacific)
>>> d.truncate(''month'')
Delorean(datetime=2015-03-01 00:00:00-07:00, timezone=US/Pacific)
>>> d.truncate(''year'')
Delorean(datetime=2015-01-01 00:00:00-07:00, timezone=US/Pacific)
y si quiere recuperar el valor de la fecha:
>>> d.truncate(''year'').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo ''US/Pacific'' PDT-1 day, 17:00:00 DST>)
No puede truncar un objeto datetime porque es inmutable .
Sin embargo, aquí hay una forma de construir una nueva fecha y hora con campos de 0 horas, minutos, segundos y microsegundos, sin descartar la fecha original o tzinfo:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
Para obtener una medianoche correspondiente a un objeto datetime determinado, puede usar el método datetime.combine()
:
>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)
La ventaja en comparación con el método .replace()
es que la solución basada en datetime.combine()
continuará funcionando incluso si el módulo de datetime
introduce el soporte de nanosegundos .
tzinfo
se puede conservar si es necesario, pero el desplazamiento utc puede ser diferente a medianoche, por ejemplo, debido a una transición DST y, por lo tanto, una solución ingenua (configuración del tzinfo
tiempo tzinfo
) puede fallar. Consulte ¿Cómo obtengo la hora UTC de "medianoche" para una zona horaria determinada?
Puede usar datetime.strftime para extraer el día, el mes, el año ...
Ejemplo:
from datetime import datetime
d = datetime.today()
# Retrieves the day and the year
print d.strftime("%d-%Y")
Salida (para hoy):
29-2011
Si solo desea recuperar el día, puede usar un atributo de día como:
from datetime import datetime
d = datetime.today()
# Retrieves the day
print d.day
Ouput (por hoy):
29
Use una date
no una datetime
y datetime
si no le importa la hora.
>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)
Puede actualizar una fecha y hora como esta:
>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)