Chuyển đổi ngày thành datetime trong Python


632

Có một phương thức tích hợp nào để chuyển đổi datethành một datetimetrong Python, ví dụ như nhận được datetimenửa đêm của ngày đã cho không? Việc chuyển đổi ngược lại rất dễ dàng: datetimecó một .date()phương pháp.

Tôi có thực sự phải gọi bằng tay datetime(d.year, d.month, d.day)không?


118
Không phải là một câu hỏi ngớ ngẩn; đối tượng ngày nên có một .datetime()phương thức; Điều ngớ ngẩn là họ không có một phương pháp như vậy.
Zags

9
@Zags: hoặc nhà datetime.from_date()xây dựng.
jfs

2
@DavidNemekey: đọc bình luận của Zags mà bình luận của tôi trả lời. Đó là về những phương pháp nên tồn tại.
JFS

2
@JFSebastian: Tôi không biết mình đã bỏ lỡ điều đó như thế nào ... và tôi hoàn toàn đồng ý.
David Nemekey

7
không, không nên hẹn hò là một tập hợp con của datetime (ngay cả trong tên). Không rõ ràng ngày tháng là gì từ thời gian. Nhưng ngược lại, một ngày là một khối 24h (thông thường), vì vậy nó có thể có nhiều thời gian. Ngày nào sẽ đến từ một ngày? Bạn không thể luôn luôn như vậy 00:00 bởi vì nếu thời gian đó không tồn tại, ví dụ như tiết kiệm ánh sáng ban ngày đã bỏ qua nó. Không quá dễ dàng #
dinois

Câu trả lời:


804

Bạn có thể sử dụng datetime.combine(date, time); đôi khi, bạn tạo một datetime.timeđối tượng được khởi tạo đến nửa đêm.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())

79
Cảm ơn. Kết hợp với thực tế là thời gian () trả về (0,0) Tôi nghĩ rằng điều này xuất hiện rõ ràng nhất:datetime.combine(d, time())
EMP

33
Chỉ cần cẩn thận không để mã của bạn nhận được datetime.time () bị nhầm lẫn với time.time (). Tên đủ điều kiện FTW!
Dustin

8
Vâng, điểm tốt. May mắn thay, kết hợp () làm tăng ngoại lệ nếu bạn vượt qua time.timehoặc bất kỳ thứ gì khác ngoài a datetime.time.
EMP

21
Trong nửa đêm, có một hằng số trăn ở cả datetime.time.min (2.7.1+) hoặc datetime.min.time () (trăn cũ)
larham1

16
Giải pháp tốt, nhưng tôi không nghĩ datetime.min.time () là cách sạch nhất để có được thời gian 00:00:00. Đó là bởi vì những gì nó làm trước tiên là lấy giá trị tối thiểu có thể biểu thị bằng datetime và sau đó lấy thành phần thời gian của nó. Ngẫu nhiên, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = Không) và có thời gian 00:00:00. Tuy nhiên, tôi nghĩ sẽ rõ ràng hơn khi tạo một thời gian 00:00:00 theo thời gian.min hoặc time (0, 0, 0, 0).
Florin Dumitrescu

130

Có một số cách, mặc dù tôi tin rằng cách bạn đề cập (và không thích) là cách dễ đọc nhất.

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

và v.v. - nhưng về cơ bản, tất cả họ đều xoay quanh việc trích xuất thông tin một cách thích hợp từ dateđối tượng và đưa nó trở lại vào ctor hoặc hàm chức năng phù hợp cho datetime.


12
Điểm rất tốt. datetime(d.year, d.month, d.day)có vẻ dễ đọc hơn nhiều so với câu trả lời được chấp nhận datetime.combine(d, datetime.min.time()).
Simon Tewsi

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)có vẻ sạch hơn (được đề xuất bởi @larham1 )
JFS

2
@JF Sebastian: Nó có phần gọn gàng hơn nhưng tôi đồng ý với Wes Winham trong câu trả lời của anh ấy rằng nó đòi hỏi người đọc phải biết datetime.time.min đại diện cho cái gì. Trong khi đó đối với tôi điều đó datetime(d.year, d.month, d.day)rõ ràng hơn (một thời gian không có thành phần thời gian). Tuy nhiên, đó là một điểm nhỏ và sử dụng một tên biến như "nửa đêm" cho thấy rõ kết quả là gì ngay cả khi người đọc không biết những gì datetime.time.minđại diện.
Simon Tewsi


76

Câu trả lời được chấp nhận là chính xác, nhưng tôi muốn tránh sử dụng datetime.min.time()vì nó không rõ ràng với tôi chính xác những gì nó làm. Nếu nó rõ ràng với bạn, thì thêm sức mạnh cho bạn. Tôi cũng cảm thấy như vậy về timetuplephương pháp và sự phụ thuộc vào thứ tự.

Theo tôi, cách dễ hiểu, rõ ràng nhất để thực hiện việc này mà không cần dựa vào người đọc để làm quen với datetimeAPI mô-đun là:

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

Đó là nhận định của tôi về "rõ ràng là tốt hơn ngầm định."


Và một lời khuyên cho Kyle Gibson cho ý tưởng ban đầu: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

Tôi đồng ý với tình cảm của bạn. Tất cả những câu trả lời khác với thời gian biểu và dấu sao và min.time () yêu cầu nghiên cứu và cách xử lý ngày và thời gian của Python là hơi cồng kềnh so với việc Microsoft xử lý chúng dễ dàng trong VBA. Nó đơn giản như gói chúng trong các biểu tượng băm trong ngôn ngữ đó. Nhưng tôi lạc đề.
Bobort

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)chức năng trên lót của câu trả lời này.
aliqandil

Điều này hoạt động, nhưng bạn có thể cần phải datetimebiết múi giờ. Trong trường hợp đó, bạn có thể import pytzvà sau đó thêm tzinfo=pytz.timezone('Europe/London'), ví dụ.
alstr

48

Bạn có thể sử dụng date.timetuple()phương thức và giải nén toán tử *.

args = d.timetuple()[:6]
datetime.datetime(*args)

3
Điều này rất hữu ích cho tình huống của tôi. Tôi không biết đó là ngày hay thời gian tôi đang được thông qua, và nó không phải là rất hay để kiểm tra xem đó là lớp nào. Phương thức này có vẻ như nó sẽ hoạt động cho cả các đối tượng datetime và date.
Gattster

Tôi đã từng sử dụng điều này trước khi khám phá datetime.combinequa câu trả lời của @ kiamlaluno. Tôi nghĩ rằng nó khá là pythonic, đặc biệt là khi xây dựng một datetime.timevật thể có khả năng trông giống như thế datetime.time(*map(int,"H:M:S".split(":")))nào đó ...
Tom

1
Đây là câu trả lời yêu thích của tôi
Nam G VU

8

Hôm nay là năm 2016, tôi nghĩ rằng giải pháp sạch nhất được cung cấp bởi gấu trúc Timestamp:

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

Dấu thời gian là gấu trúc tương đương với datetime và có thể hoán đổi với nó trong hầu hết các trường hợp. Kiểm tra:

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

Nhưng trong trường hợp bạn thực sự muốn một thời gian vani, bạn vẫn có thể làm:

pd.Timestamp(d).to_datetime()

Dấu thời gian mạnh hơn rất nhiều so với thời gian, trong số những thứ khác khi xử lý các múi giờ. Trên thực tế, Dấu thời gian rất mạnh đến nỗi thật đáng tiếc khi chúng được ghi chép kém ...


Cuộc gọi tốt Đến đây vì tôi nghĩ rằng nó sẽ cần một giải pháp datetime python cho vấn đề Datetime Index của gấu trúc. Gấu trúc xấu hổ không có khái niệm về Date Index.
Bàn Bobby nhỏ

6
Tại sao chúng ta yêu cầu một gói hạng nặng chỉ để thực hiện thao tác datetime, ngay cả trong năm 2016?!
cowbert

Mang ra gấu trúc cho việc này giống như lấy búa cho một con kiến
Deji S

5

Một cách để chuyển đổi từ ngày sang datetime chưa được đề cập:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
Đúng, nhưng chuyển đổi int thành chuỗi và trở lại có lẽ tốn kém hơn so với làm việc trực tiếp với int, vì vậy tôi chỉ sử dụng công cụ này để xử lý khối lượng thấp
Egor Kraev

3

Bạn có thể sử dụng easy_date để làm cho nó dễ dàng:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)

-10

Nếu bạn cần một cái gì đó nhanh chóng, datetime_object.date()cung cấp cho bạn một ngày của một đối tượng datetime.


8
các op muốn ngược lại, đi từ dateđến datetime.
Tom

Từ câu hỏi: Việc chuyển đổi ngược lại rất dễ dàng: datetimecó một .date()phương pháp. , nhấn mạnh đậm của tôi.
Martijn Pieters

-13

Tôi là người mới chơi Python. Nhưng mã này đã làm việc cho tôi để chuyển đổi đầu vào được chỉ định mà tôi cung cấp thành datetime. Đây là mã. Sửa tôi nếu tôi sai.

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 có một datetime.date()đối tượng, không phải là một chuỗi .
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.