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)?

EMP
fuente
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())
kiamlaluno
fuente
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.

Alex Martelli
fuente
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".

Wes Winham
fuente
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)
teepark
fuente
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 ...

kadee
fuente
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')
kadee
fuente
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
3

Puede usar easy_date para facilitarlo:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
Raphael Amoedo
fuente
-10

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

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