Konwertuj datę na datę i godzinę w Pythonie

632

Czy istnieje wbudowana metoda konwersji a datena datetimePythona, na przykład uzyskanie datetimepółnocy danej daty? Odwrotna konwersja jest łatwa: datetimema .date()metodę.

Czy naprawdę muszę ręcznie dzwonić datetime(d.year, d.month, d.day)?

EMP
źródło
118
Nie głupie pytanie; obiekty daty powinny mieć .datetime()metodę; głupie jest to, że nie mają takiej metody.
Zags,
9
@Zags: lub datetime.from_date()konstruktor.
jfs
2
@DavidNemeskey: przeczytaj komentarz Zagsa, na który odpowiada mój komentarz. Chodzi o to, jakie metody powinny istnieć.
jfs
2
@JFSebastian: Nie mam pojęcia, jak mi tego brakowało ... i całkowicie się zgadzam.
David Nemeskey
7
nie, to nie powinno być podzbiorem daty i godziny (nawet w nazwie). Nie jest jednoznaczne, jaka jest data od daty i godziny. Ale odwrotnie, data jest blokiem 24 godzin (zwykle), więc może mieć wiele okresów danych. Która data i godzina miałaby pochodzić z daty? Nie zawsze możesz tak 00:00, ponieważ co, jeśli ten czas nie istnieje, na przykład pomijanie go w czasie letnim. Nie takie łatwe #
dalore

Odpowiedzi:

803

Możesz użyć datetime.combine(date, time); na razie tworzysz datetime.timeobiekt zainicjowany do północy.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
źródło
79
Dzięki. W połączeniu z faktem, że time () zwraca (0,0) Myślę, że to wychodzi najczystsze:datetime.combine(d, time())
EMP
33
Uważaj tylko, aby nie pomylić kodu z datetime.time () z time.time (). Nazwy kwalifikowane FTW!
Dustin
8
Tak, dobra uwaga. Na szczęście, Combine () wywołuje wyjątek, jeśli przekażesz time.timecoś innego niż a datetime.time.
EMP
21
Na północ jest stała pythona w datetime.time.min (2.7.1+) lub datetime.min.time () (starszy python)
larham1
16
Dobre rozwiązanie, ale nie sądzę, że datetime.min.time () jest najczystszym sposobem na uzyskanie godziny 00:00:00. Wynika to z tego, że najpierw pobiera minimalną wartość reprezentowaną przez datę i godzinę, a następnie pobiera składnik czasu. Nawiasem mówiąc, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) i ma czas 00:00:00. Jednak myślę, że czystsze jest jawne utworzenie godziny 00:00:00 albo poprzez time.min albo time (0, 0, 0, 0).
Florin Dumitrescu,
130

Istnieje kilka sposobów, choć uważam, że ten, o którym wspominasz (i którego nie lubisz), jest najbardziej czytelny.

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

i tak dalej - ale w gruncie rzeczy wszystkie polegają na odpowiednim wydobyciu informacji z dateobiektu i włożeniu go z powrotem do odpowiedniego ctor lub funkcji klasy datetime.

Alex Martelli
źródło
12
Bardzo dobra uwaga. datetime(d.year, d.month, d.day)wydaje się o wiele bardziej czytelny niż zaakceptowana odpowiedź datetime.combine(d, datetime.min.time()).
Simon Tewsi
2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)wydaje się czystszy (sugerowany przez @larham1 )
jfs
2
@JF Sebastian: Jest nieco czystszy, ale zgadzam się z Wesiem Winhamem w jego odpowiedzi, że wymaga od czytelnika wiedzy, co oznacza datetime.time.min. Wydaje mi się jednak, że datetime(d.year, d.month, d.day)jest to bardziej oczywiste (data i godzina bez komponentu czasu). Jest to drobna kwestia, a użycie nazwy zmiennej, takiej jak „północ”, wyraźnie pokazuje, jaki jest wynik, nawet jeśli czytelnik nie wie, co datetime.time.minreprezentuje.
Simon Tewsi,
76

Przyjęta odpowiedź jest poprawna, ale wolałbym unikać używania, datetime.min.time()ponieważ nie jest dla mnie oczywiste, co dokładnie robi. Jeśli to dla ciebie oczywiste, to więcej mocy dla ciebie. Tak samo myślę o timetuplemetodzie i zaufaniu do zamówienia.

Moim zdaniem najbardziej czytelnym, wyraźnym sposobem na zrobienie tego bez polegania na tym, że czytelnik dobrze zna datetimeinterfejs API modułu jest:

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

Takie jest moje zdanie „wyraźne jest lepsze niż niejawne”.

Wes Winham
źródło
I czapka dla Kyle'a Gibsona na temat oryginalnego pomysłu: stackoverflow.com/users/513197/kyle-gibson
Wes Winham
Zgadzam się z twoim sentymentem. Wszystkie te odpowiedzi z timuple, gwiazdkami i min.time () wymagają badań, a sposób obsługi dat i godzin danych w Pythonie jest nieco uciążliwy w porównaniu z łatwością, jaką Microsoft obsługuje w VBA. To tak proste, jak zawijanie ich w symbole skrótu w tym języku. Ale dygresję.
Bobort
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)funkcja on-line tej odpowiedzi.
aliqandil
To działa, ale być może trzeba datetimemieć świadomość strefy czasowej. W takim przypadku możesz na przykład import pytzdodać tzinfo=pytz.timezone('Europe/London').
alstr
48

Możesz użyć date.timetuple()metody i rozpakować operatora *.

args = d.timetuple()[:6]
datetime.datetime(*args)
teepark
źródło
3
Jest to przydatne w mojej sytuacji. Nie wiem, czy mija mi data, czy data, i sprawdzanie, która to klasa, nie jest zbyt pytoniczne. Ta metoda wygląda, jakby działała zarówno dla obiektów daty i godziny, jak i daty.
Gattster,
datetime.combineUżywałem tego przed odkryciem odpowiedzi @ kiamlaluno. Myślę, że jest dość pytoniczny, zwłaszcza biorąc pod uwagę, że skonstruowanie datetime.timeobiektu prawdopodobnie i tak będzie wyglądać datetime.time(*map(int,"H:M:S".split(":")))...
Tom
1
To moja ulubiona odpowiedź
Nam G VU
9

Dziś, w 2016 roku, myślę, że najczystsze rozwiązanie zapewnia pandas Timestamp:

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

Znacznik czasu jest pandą równoważną datetime i jest z nim wymienny w większości przypadków. Czek:

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

Ale jeśli naprawdę chcesz waniliową datę i godzinę, nadal możesz:

pd.Timestamp(d).to_datetime()

Znaczniki czasu są znacznie potężniejsze niż czasy danych, między innymi w przypadku stref czasowych. W rzeczywistości znaczniki czasu są tak potężne, że szkoda, że ​​są tak słabo udokumentowane ...

Kadee
źródło
Dobra decyzja. Przyszedł tutaj, ponieważ myślałem, że będzie potrzebował rozwiązania python datetime do problemu pandas DatetimeIndex. Wstydliwe pandy nie mają pojęcia DateIndex.
Małe tabele Bobby
5
dlaczego potrzebujemy pakietu wagi ciężkiej tylko do manipulacji datetime, nawet w 2016 roku ?!
cowbert
Wydawanie w tym celu pand jest jak zabicie młota mrówce
Deji S
5

Jeden ze sposobów konwersji z daty na datę i godzinę, o którym jeszcze nie wspomniano:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
Kadee
źródło
1
To prawda, ale konwersja ints na ciągi znaków i odwrotnie jest prawdopodobnie raczej droższa niż bezpośrednia praca z ints, więc
użyłbym
3

Aby ułatwić, możesz użyć easy_date :

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
Raphael Amoedo
źródło
-10

Jeśli potrzebujesz czegoś szybkiego, datetime_object.date()podaje datę obiektu typu data-godzina.

Bassdread
źródło
8
operacja chce czegoś przeciwnego, aby przejść od datedo datetime.
Tom
Z pytaniem: konwersja naprzeciwko jest prosta: ma metody. , odważny nacisk moje. datetime.date()
Martijn Pieters
-13

Jestem nowicjuszem w Pythonie. Ale ten kod działał dla mnie, który konwertuje określone dane wejściowe, które dostarczam na datetime. Oto kod. Popraw mnie, jeśli się mylę.

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
źródło
OP ma datetime.date()obiekt, a nie ciąg znaków .
Martijn Pieters