¿Cuál es una forma elegante de truncar un objeto de fecha y hora de Python?
En este caso particular, al día. Básicamente, establece la hora, los minutos, los segundos y los microsegundos en 0.
Me gustaría que la salida también sea un objeto de fecha y hora, no una cadena.
replace()
método devuelve un objeto de fecha y hora, por lo que el encantamiento correcto sería:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datetime
, nodate
objeto (que podrías obtener usandodt.date()
call (no es necesario usar el constructor explícito)). El.replace()
método puede fallar sidatetime
agrega soporte de nanosegundos . Podrías usardatetime.combine()
en su lugar .datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?Use un
date
no adatetime
si no le importa el tiempo.Puede actualizar una fecha y hora como esta:
fuente
Cuatro años después: otra forma, evitando
replace
Sé que la respuesta aceptada de hace cuatro años funciona, pero esto parece un poco más ligero que usar
replace
:Notas
datetime
objeto sin pasar propiedades de tiempo al constructor, obtiene la medianoche.dt = datetime.datetime.now()
fuente
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 tirar la fecha original o tzinfo:
fuente
replace
opción primero, ya que eso es probablemente lo que quieren.tzinfo=now.tzinfo
. A latzinfo
medianoche puede ser diferente, por ejemplo, el desplazamiento utc a las2012-04-01 00:09:00
(9 a.m.) en Australia / Melbourne es la zona horaria,AEST+10:00
pero esAEDT+11:00
a las2012-04-01 00:00:00
(medianoche): hay una transición al final del horario de verano en ese día. Podrías usar elpytz
módulo para arreglarlo, mira mi respuesta.Para obtener una medianoche correspondiente a un objeto de fecha y hora dado, puede usar el
datetime.combine()
método :La ventaja en comparación con el
.replace()
método es que ladatetime.combine()
solución basada continuará funcionando incluso si eldatetime
módulo introduce el soporte de nanosegundos .tzinfo
puede conservarse si es necesario, pero el desplazamiento utc puede ser diferente a la medianoche, por ejemplo, debido a una transición DST y, por lo tanto, una solución ingenua (tzinfo
atributo de tiempo de configuración ) puede fallar. Consulte ¿Cómo obtengo la hora UTC de "medianoche" para una zona horaria determinada?fuente
Podría usar pandas para eso (aunque podría ser una sobrecarga para esa tarea). Puede usar redondo , piso y techo como para los números habituales y cualquier frecuencia de pandas de alias offset :
fuente
Puede usar datetime.strftime para extraer el día, el mes, el año ...
Ejemplo:
Salida (para hoy):
Si solo desea recuperar el día, puede usar el atributo day como:
Ouput (por hoy):
fuente
d.day
etc.Hay una gran biblioteca utilizada para manipular fechas: Delorean
y si desea recuperar el valor de fecha y hora:
fuente
Ver más en https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html
Ahora es 2019, creo que la forma más eficiente de hacerlo es:
fuente
Hay un módulo datetime_truncate que maneja esto para usted. Simplemente llama a datetime.replace.
fuente
6 años después ... encontré esta publicación y me gustó más el enfoque numpy:
salud
fuente
fuente
Puedes usar
Es ligero y devuelve exactamente lo que quieres.
fuente
¿Qué significa truncar?
Usted tiene control total sobre el formato utilizando el método strftime () y utilizando una cadena de formato adecuada.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
fuente
Si se trata de una serie de tipo DateTime, hay una forma más eficiente de truncarlas, especialmente cuando el objeto de la serie tiene muchas filas.
Puedes usar la función de piso
Por ejemplo, si desea truncarlo a horas:
Genera un rango de fechas
Podemos verificarlo comparando el tiempo de ejecución entre las funciones de reemplazo y de piso.
fuente
Aquí hay otra forma que encaja en una línea pero que no es particularmente elegante:
fuente