Converter data em data e hora em Python

632

Existe um método interno para converter um dateem um datetimeem Python, por exemplo, obter datetimea meia-noite da data especificada? A conversão oposta é fácil: datetimetem um .date()método.

Eu realmente preciso ligar manualmente datetime(d.year, d.month, d.day)?

EMP
fonte
118
Não é uma pergunta boba; objetos de data devem ter um .datetime()método; o que é bobo é que eles não têm esse método.
Zags
9
@ Zags: ou datetime.from_date()construtor.
JFS
2
@DavidNemeskey: leia o comentário de Zags ao qual meu comentário responde. É sobre quais métodos deveriam ter existido.
JFS
2
@JFSebastian: Eu não tenho idéia de como eu perdi isso ... e eu concordo completamente.
David Nemeskey
7
não, uma data não deve ser um subconjunto de data / hora (é mesmo no nome). Não é ambíguo qual é a data de uma data e hora. Mas, ao contrário, uma data é um bloco de 24h (geralmente), portanto, pode ter muitas datas. Que data / hora viria de uma data? Você não pode sempre 00:00 porque, e se esse horário não existir, como por exemplo, o horário de verão o ignorou. Não é tão fácil # #
dalore

Respostas:

804

Você pode usar datetime.combine(date, time); durante o tempo, você cria um datetime.timeobjeto inicializado para meia-noite.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
fonte
79
Obrigado. Combinado com o fato de que time () retorna (0,0), acho que isso sai mais limpo:datetime.combine(d, time())
EMP
33
Apenas tome cuidado para não deixar seu código confundir datetime.time () com time.time (). Nomes qualificados FTW!
Dustin
8
Sim, bom argumento. Felizmente, combine () gera uma exceção se você passar um time.timeou qualquer outra coisa que não seja um datetime.time.
EMP
21
Para a meia-noite, há uma constante python em qualquer datetime.time.min (2.7.1+) ou datetime.min.time () (python mais velho)
larham1
16
Boa solução, mas não acho que datetime.min.time () seja a maneira mais limpa de obter um horário 00:00:00. Isso ocorre porque primeiro é recuperado o valor mínimo representável por data e hora e, em seguida, obtendo seu componente de hora. Aliás, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) e possui um horário de 00:00:00. No entanto, acho que é mais fácil criar explicitamente um horário 00:00:00 através de time.min ou time (0, 0, 0, 0).
Florin Dumitrescu
130

Existem várias maneiras, embora eu acredite que a que você menciona (e não gosta) é a mais legível.

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

e assim por diante - mas basicamente todos eles dependem da extração apropriada de informações do dateobjeto e da sua devolução ao ctor ou função de classe adequada datetime.

Alex Martelli
fonte
12
Muito bom ponto. datetime(d.year, d.month, d.day)parece muito mais legível do que a resposta aceita datetime.combine(d, datetime.min.time()).
Simon Tewsi
2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)parece mais limpo (sugerido por @larham1 )
jfs
2
@JF Sebastian: É um pouco mais limpo, mas concordo com Wes Winham em sua resposta de que exige que o leitor saiba o que datetime.time.min representa. Considerando que me parece datetime(d.year, d.month, d.day)mais óbvio (um datetime sem o componente time). É um ponto menor, porém, e usar um nome de variável como "meia-noite" torna óbvio qual é o resultado, mesmo que o leitor não saiba o que datetime.time.minrepresenta.
Simon Tewsi
76

A resposta aceita está correta, mas eu preferiria evitar usar datetime.min.time()porque não é óbvio para mim exatamente o que faz. Se é óbvio para você, mais poder para você. Eu também sinto o mesmo sobre otimetuple método e a confiança no pedido.

Na minha opinião, a maneira mais legível e explícita de fazer isso sem depender do leitor para estar muito familiarizado com a datetimeAPI do módulo é:

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

Essa é a minha opinião sobre "explícito é melhor do que implícito".

Wes Winham
fonte
E uma ponta chapéu para Kyle Gibson para a ideia original: stackoverflow.com/users/513197/kyle-gibson
Wes Winham
Eu concordo com o seu sentimento. Todas essas outras respostas, com horário e asteriscos e min.time (), exigem pesquisa, e a maneira como o Python lida com datas e horários é um pouco complicada, comparada à facilidade com que a Microsoft lida com eles no VBA. É tão simples quanto envolvê-los em símbolos de hash nesse idioma. Mas eu discordo.
Bobort
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)função on-liner desta resposta.
91317 aliqandil
Isso funciona, mas você pode precisar datetimeestar ciente do fuso horário. Nesse caso, você pode import pytze, em seguida tzinfo=pytz.timezone('Europe/London'), adicionar , por exemplo.
alstr
48

Você pode usar o date.timetuple()método e descompactar o operador *.

args = d.timetuple()[:6]
datetime.datetime(*args)
teepark
fonte
3
Isso é útil para a minha situação. Não sei se estou passando uma data ou uma data e hora e não é muito pitônico verificar qual classe é essa. Esse método parece que funcionará para objetos datetime e date.
Gattster 14/10/10
Eu costumava usar isso antes de descobrir datetime.combineatravés da resposta do @ kiamlaluno. Eu acho que é bastante pitônico, especialmente considerando que a construção de um datetime.timeobjeto provavelmente se parece com algo datetime.time(*map(int,"H:M:S".split(":")))assim ...
Tom
1
Esta é minha resposta preferida
Nam G VU
8

Hoje sendo 2016, acho que a solução mais limpa é fornecida pelos pandas Timestamp:

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

O registro de data e hora é o equivalente dos pandas à data e hora e é intercambiável com ele na maioria dos casos. Verifica:

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

Mas, se você realmente quer um data e hora de baunilha, ainda pode:

pd.Timestamp(d).to_datetime()

Os registros de data e hora são muito mais poderosos do que as datas, entre outros quando se lida com fusos horários. Na verdade, os carimbos de data e hora são tão poderosos que é uma pena que sejam tão mal documentados ...

kadee
fonte
Boa decisão. Vim aqui como pensei que seria necessário uma solução de data e hora em python para um problema do DatetimeIndex do pandas. Os pandas de vergonha não têm o conceito de um DateIndex.
Little Bobby Tables
6
por que exigimos um pacote pesado apenas para manipular data e hora, mesmo em 2016 ?!
cowbert
Trazer pandas para isso é como levar um martelo a uma formiga
Deji S
5

Uma maneira de converter de data para data e hora que ainda não foi mencionada:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
kadee
fonte
1
É verdade, mas converter inteiros em strings e de volta é provavelmente um pouco mais caro do que trabalhar diretamente com ints, então eu só usaria este para o processamento de baixo volume
Egor Kraev
3

Você pode usar easy_date para facilitar:

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

Se você precisar de algo rápido, datetime_object.date()fornece uma data para um objeto datetime.

Bassdread
fonte
8
o op quer o oposto, vá de datepara datetime.
Tom
Da pergunta: A conversão oposta é fácil: datetimetem um .date()método. , ênfase em negrito minha.
Martijn Pieters
-13

Eu sou um novato em Python. Mas esse código funcionou para mim, que converte a entrada especificada que forneço para data e hora. Aqui está o código. Corrija-me se eu estiver errado.

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
fonte
O OP tem um datetime.date()objeto, não uma sequência .
Martijn Pieters