Ubah tanggal menjadi datetime dengan Python

632

Apakah ada metode bawaan untuk mengonversi a dateke datetimedalam Python, misalnya mendapatkan datetimeuntuk tengah malam dari tanggal yang diberikan? Konversi sebaliknya mudah: datetimememiliki .date()metode.

Apakah saya harus menelepon secara manual datetime(d.year, d.month, d.day)?

EMP
sumber
118
Bukan pertanyaan konyol; objek tanggal harus memiliki .datetime()metode; yang konyol adalah mereka tidak memiliki metode seperti itu.
Zags
9
@Zags: atau datetime.from_date()konstruktor.
jfs
2
@DavidNemeskey: baca komentar Zags yang dibalas oleh komentar saya. Ini tentang metode apa yang seharusnya ada.
jfs
2
@ JSFSebastian: Saya tidak tahu bagaimana saya melewatkannya ... dan saya sepenuhnya setuju.
David Nemeskey
7
tidak, itu seharusnya bukan tanggal adalah bagian dari datetime (itu bahkan dalam nama). Tidak jelas apa tanggalnya dari suatu datetime. Namun sebaliknya, tanggal adalah blok 24 jam (biasanya), sehingga dapat memiliki banyak data. Tanggal berapa yang akan datang dari kencan? Anda tidak dapat selalu begitu 00:00 karena bagaimana jika waktu itu tidak ada, seperti misalnya penghematan siang hari melewatkannya. Tidak begitu mudah #
dalore

Jawaban:

804

Anda bisa menggunakan datetime.combine(date, time); untuk saat ini, Anda membuat datetime.timeobjek yang diinisialisasi ke tengah malam.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
sumber
79
Terima kasih. Digabungkan dengan fakta bahwa time () mengembalikan (0,0) Saya pikir ini keluar yang terbersih:datetime.combine(d, time())
EMP
33
Hanya berhati-hatilah agar kode Anda tidak mendapatkan datetime.time () bingung dengan time.time (). Nama yang memenuhi syarat FTW!
Dustin
8
Ya, poin bagus. Untungnya, kombinasikan () memunculkan pengecualian jika Anda memberikan time.timeatau apa pun selain a datetime.time.
EMP
21
Untuk tengah malam, ada konstanta python di datetime.time.min (2.7.1+) atau datetime.min.time () (python lama)
larham1
16
Solusi yang bagus, tapi saya tidak berpikir datetime.min.time () adalah cara terbersih untuk mendapatkan waktu 00:00:00. Itu karena apa yang dilakukannya adalah pertama-tama mengambil nilai minimum yang dapat diwakili oleh datetime dan kemudian mendapatkan komponen waktunya. Kebetulan, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = Tidak Ada) dan memiliki waktu 00:00:00. Namun, saya pikir lebih bersih untuk secara eksplisit membuat waktu 00:00:00 melalui time.min atau waktu (0, 0, 0, 0).
Florin Dumitrescu
130

Ada beberapa cara, meskipun saya percaya yang Anda sebutkan (dan tidak suka) adalah yang paling mudah dibaca.

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

dan sebagainya - tetapi pada dasarnya mereka semua bergantung pada mengekstraksi info dengan tepat dari dateobjek dan membajaknya kembali ke ctor atau classfunction yang sesuai untuk datetime.

Alex Martelli
sumber
12
Poin yang sangat bagus. datetime(d.year, d.month, d.day)tampaknya jauh lebih mudah dibaca daripada jawaban yang diterima datetime.combine(d, datetime.min.time()).
Simon Tewsi
2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)tampaknya lebih bersih (disarankan oleh @larham1 )
jfs
2
@ JF Sebastian: Agak lebih bersih tapi saya setuju dengan Wes Winham dalam jawabannya bahwa itu mengharuskan pembaca untuk mengetahui apa yang diwakili datetime.time.min. Padahal menurut saya itu datetime(d.year, d.month, d.day)lebih jelas (suatu datetime tanpa komponen waktu). Namun, ini adalah poin minor, dan menggunakan nama variabel seperti "tengah malam" membuatnya menjadi jelas apa hasilnya meskipun pembaca tidak tahu apa yang datetime.time.mindiwakilinya.
Simon Tewsi
76

Jawaban yang diterima benar, tetapi saya lebih suka menghindari penggunaan datetime.min.time()karena tidak jelas bagi saya apa yang dilakukannya. Jika jelas bagi Anda, maka lebih banyak kekuatan untuk Anda. Saya juga merasakan hal yang sama tentang timetuplemetode dan ketergantungan pada pemesanan.

Menurut pendapat saya, cara eksplisit yang paling mudah dibaca untuk melakukan ini tanpa bergantung pada pembaca untuk sangat terbiasa dengan datetimeAPI modul adalah:

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

Itulah pendapat saya tentang "eksplisit lebih baik daripada implisit."

Wes Winham
sumber
Dan tip topi untuk Kyle Gibson untuk ide aslinya: stackoverflow.com/users/513197/kyle-gibson
Wes Winham
Saya setuju dengan sentimen Anda. Semua jawaban lain dengan jadwal dan tanda bintang dan min.time () memerlukan penelitian, dan cara Python menangani tanggal dan waktu agak rumit pula dibandingkan dengan kemudahan yang Microsoft tangani dalam VBA. Sesederhana membungkus mereka dalam simbol hash dalam bahasa itu. Tapi saya ngelantur.
Bobort
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)fungsi on-liner dari jawaban ini.
aliqandil
Ini berfungsi, tetapi Anda mungkin perlu datetimemenyadari zona waktu. Dalam hal ini, Anda bisa import pytzdan kemudian menambahkan tzinfo=pytz.timezone('Europe/London'), misalnya.
alstr
48

Anda dapat menggunakan date.timetuple()metode ini dan membongkar operator *.

args = d.timetuple()[:6]
datetime.datetime(*args)
teepark
sumber
3
Ini berguna untuk situasi saya. Saya tidak tahu apakah ini tanggal atau waktu yang saya lewati, dan tidak terlalu pythonic untuk memeriksa kelas yang mana. Metode ini sepertinya akan bekerja untuk objek waktu dan tanggal.
Gattster
Saya biasa menggunakan ini sebelum menemukan datetime.combinemelalui jawaban @ kiamlaluno. Saya pikir itu agak pythonic, terutama mengingat membangun datetime.timeobjek cenderung terlihat seperti datetime.time(*map(int,"H:M:S".split(":")))...
Tom
1
Ini adalah jawaban favorit saya
Nam G VU
8

Hari ini menjadi 2016, saya pikir solusi terbersih disediakan oleh panda Timestamp:

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

Stempel waktu adalah panda yang setara dengan datetime dan dapat dipertukarkan dengannya dalam kebanyakan kasus. Memeriksa:

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

Tetapi jika Anda benar-benar menginginkan data vanilla, Anda masih bisa melakukannya:

pd.Timestamp(d).to_datetime()

Cap waktu jauh lebih kuat daripada waktu data, antara lain ketika berhadapan dengan zona waktu. Sebenarnya, cap waktu begitu kuat sehingga sangat disayangkan mereka begitu buruk didokumentasikan ...

Kadee
sumber
Panggilan yang bagus. Datang ke sini karena saya pikir itu akan membutuhkan solusi datetime python untuk masalah DatetimeIndex panda. Panda yang memalukan tidak memiliki konsep DateIndex.
Little Bobby Tables
6
mengapa kita memerlukan paket kelas berat hanya untuk melakukan manipulasi datetime, bahkan pada tahun 2016 ?!
cowbert
Membawa panda untuk ini seperti membawa palu ke semut
Deji S
5

Salah satu cara untuk mengkonversi dari tanggal ke waktu yang belum disebutkan:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
Kadee
sumber
1
Benar, tetapi mengkonversi ints ke string dan kembali mungkin agak lebih mahal daripada bekerja secara langsung dengan ints, jadi saya hanya menggunakan yang ini untuk pemrosesan volume rendah
Egor Kraev
3

Anda dapat menggunakan easy_date untuk membuatnya mudah:

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

Jika Anda memerlukan sesuatu dengan cepat, datetime_object.date()memberi Anda tanggal objek datetime.

Bassdread
sumber
8
op menginginkan yang sebaliknya, untuk beralih dari dateke datetime.
Tom
Dari pertanyaan: The konversi berlawanan mudah: datetimememiliki .date()metode. , tekankan saya.
Martijn Pieters
-13

Saya seorang pemula untuk Python. Tetapi kode ini bekerja untuk saya yang mengubah input yang ditentukan saya berikan ke datetime. Ini kodenya. Koreksi saya jika saya salah.

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
sumber
OP memiliki datetime.date()objek, bukan string .
Martijn Pieters