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


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

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.


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."


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)

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


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

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)

-10

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


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

OP memiliki datetime.date()objek, bukan string .
Martijn Pieters
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.