Convertir fecha a fecha y hora en Python


632

¿Existe un método incorporado para convertir a datea a datetimeen Python, por ejemplo, obtener datetimela medianoche de la fecha dada? La conversión opuesta es fácil: datetimetiene un .date()método.

¿Realmente tengo que llamar manualmente datetime(d.year, d.month, d.day)?


118
No es una pregunta tonta; los objetos de fecha deben tener un .datetime()método; Lo tonto es que no tienen ese método.
Zags

99
@Zags: o datetime.from_date()constructor.
jfs

2
@DavidNemeskey: lea el comentario de Zags al que responde mi comentario. Se trata de qué métodos deberían haber existido.
jfs

2
@JFSebastian: No tengo idea de cómo me perdí eso ... y estoy completamente de acuerdo.
David Nemeskey,

77
no, no debería una fecha es un subconjunto de fecha y hora (incluso en el nombre). No es ambiguo cuál es la fecha de una fecha y hora. Pero al revés, una fecha es un bloque de 24h (generalmente), por lo que puede tener muchas fechas. ¿Qué fecha y hora vendría de una fecha? No siempre se puede 00:00 porque qué pasa si ese tiempo no existe, como por ejemplo, el horario de verano se lo salta. No es tan fácil #
dalore

Respuestas:


805

Puedes usar datetime.combine(date, time); por el momento, crea un datetime.timeobjeto inicializado a medianoche.

from datetime import date
from datetime import datetime

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

79
Gracias. Combinado con el hecho de que el tiempo () regresa (0,0) Creo que esto sale más limpio:datetime.combine(d, time())
EMP

33
Solo tenga cuidado de que su código no se confunda datetime.time () con time.time (). Nombres calificados FTW!
Dustin

8
Si, buen punto. Afortunadamente, combine () genera una excepción si pasa una time.timeo cualquier otra cosa que no sea a datetime.time.
EMP

21
Para la medianoche, hay una constante de python en datetime.time.min (2.7.1+) o datetime.min.time () (python anterior)
larham1

16
Buena solución, pero no creo que datetime.min.time () sea la forma más limpia de obtener una hora 00:00:00. Esto se debe a que lo primero que hace es recuperar el valor mínimo representable por fecha y hora y luego obtener su componente de tiempo. Por cierto, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) y tiene una hora de 00:00:00. Sin embargo, creo que es más claro crear explícitamente una hora 00:00:00 a través de time.min o time (0, 0, 0, 0).
Florin Dumitrescu

130

Hay varias formas, aunque creo que la que mencionas (y no te gusta) es la más fácil de leer.

>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)

y así sucesivamente - pero básicamente todos ellos bisagra en la extracción de información adecuada desde el dateobjeto y el arado de nuevo en el ctor o classfunction adecuado para datetime.


12
Muy buen punto. datetime(d.year, d.month, d.day)parece mucho más legible que la respuesta aceptada datetime.combine(d, datetime.min.time()).
Simon Tewsi

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)parece más limpio (sugerido por @larham1 )
jfs

2
@JF Sebastian: es algo más limpio, pero estoy de acuerdo con Wes Winham en su respuesta de que requiere que el lector sepa qué representa datetime.time.min. Mientras que me parece que datetime(d.year, d.month, d.day)es más obvio (una fecha y hora sin el componente de tiempo). Sin embargo, es un punto menor, y el uso de un nombre de variable como "medianoche" hace obvio cuál es el resultado, incluso si el lector no sabe lo que datetime.time.minrepresenta.
Simon Tewsi


76

La respuesta aceptada es correcta, pero preferiría evitar usarla datetime.min.time()porque no es obvio para mí exactamente lo que hace. Si es obvio para ti, entonces más poder para ti. También siento lo mismo sobre el timetuplemétodo y la confianza en el pedido.

En mi opinión, la forma más legible y explícita de hacerlo sin confiar en que el lector esté muy familiarizado con el datetimemódulo API es:

from datetime import date, datetime
today = date.today()
today_with_time = datetime(
    year=today.year, 
    month=today.month,
    day=today.day,
)

Esa es mi opinión sobre "explícito es mejor que implícito".


Y un consejo para Kyle Gibson por la idea original: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

Estoy de acuerdo con tu sentimiento Todas estas otras respuestas con timetuple y asteriscos y min.time () requieren investigación, y la forma en que Python maneja las fechas y las horas es un poco engorrosa de todos modos en comparación con la facilidad con que Microsoft las maneja en VBA. Es tan simple como envolverlos con símbolos hash en ese idioma. Pero yo divago.
Bobort

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)función en línea de esta respuesta.
aliqandil

Esto funciona, pero es posible que necesite datetimetener en cuenta la zona horaria. En cuyo caso, puede import pytzy luego agregar tzinfo=pytz.timezone('Europe/London'), por ejemplo.
también

48

Puede usar el date.timetuple()método y desempaquetar el operador *.

args = d.timetuple()[:6]
datetime.datetime(*args)

3
Esto es útil para mi situación. No sé si es una fecha o una fecha y hora que me están pasando, y no es muy pitónico verificar qué clase es. Parece que este método funcionará para los objetos datetime y date.
Gattster

Solía ​​usar esto antes de descubrir a datetime.combinetravés de la respuesta de @ kiamlaluno. Creo que es bastante pitónico, especialmente dado datetime.timeque es probable que la construcción de un objeto se parezca a algo así datetime.time(*map(int,"H:M:S".split(":")))...
Tom

1
Esta es mi respuesta favorita
Nam G VU

8

Hoy, siendo 2016, creo que la solución más limpia la proporciona pandas Timestamp:

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

La marca de tiempo es el equivalente de pandas de fecha y hora y es intercambiable en la mayoría de los casos. Cheque:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

Pero en caso de que realmente desee una fecha y hora de vainilla, aún puede hacer:

pd.Timestamp(d).to_datetime()

Las marcas de tiempo son mucho más poderosas que las fechas, entre otras cuando se trata de zonas horarias. En realidad, las marcas de tiempo son tan poderosas que es una pena que estén tan mal documentadas ...


Buena llamada. Vine aquí porque pensé que necesitaría una solución de fecha y hora de Python para un problema de fecha y hora de pandas. Los pandas de la vergüenza no tienen el concepto de un DateIndex.
Little Bobby Tables

66
¿Por qué requerimos un paquete de peso pesado solo para la manipulación de fecha y hora, incluso en 2016?
cowbert

Sacar pandas para esto es como llevar un martillo a una hormiga
Deji S

5

Una forma de convertir de fecha a fecha y hora que aún no se ha mencionado:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
Es cierto, pero convertir ints en cadenas y viceversa es probablemente bastante más costoso que trabajar directamente con ints, por lo que solo usaría este para el procesamiento de bajo volumen
Egor Kraev


-10

Si necesita algo rápido, datetime_object.date()le da una fecha de un objeto datetime.


8
la op quiere lo contrario, ir de datea datetime.
Tom

De la pregunta: La conversión opuesta es fácil: datetimetiene un .date()método. , énfasis audaz el mío.
Martijn Pieters

-13

Soy un novato en Python. Pero este código funcionó para mí, que convierte la entrada especificada que proporciono a datetime. Aquí está el código. Corrígeme si estoy equivocado.

import sys
from datetime import datetime
from time import mktime, strptime

user_date = '02/15/1989'
if user_date is not None:
     user_date = datetime.strptime(user_date,"%m/%d/%Y")
else:
     user_date = datetime.now()
print user_date

El OP tiene un datetime.date()objeto, no una cadena .
Martijn Pieters
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.