2016-01-06 21 views
6

Giả sử tôi nhận được một số chuỗi có định dạng %H:%M:%S, ví dụ: 04:35:45. Tôi muốn chuyển đổi chúng thành đối tượng datetime.datetime, năm/tháng/ngày giống như datetime.datetime.now().Cách tốt nhất để tạo datetime từ "% H:% M:% S"

tôi đã cố gắng

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj.year = now.year 
datetime_obj.month = now.month 
datetime_obj.day = now.day 

này sẽ không làm việc kể từ year/month/day là chỉ đọc tài sản. Vậy giải pháp tốt nhất cho việc này là gì?

Trả lời

7

Bạn muốn datetime.combine(date, time):

>>> time = datetime.datetime.strptime("04:35:45", "%H:%M:%S").time() 
>>> time 
datetime.time(4, 35, 45) 
>>> day = datetime.datetime.now().date() 
>>> day 
datetime.date(2016, 1, 6) 
>>> datetime.datetime.combine(day, time) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 
>>> 
+0

Cá nhân tôi thích câu trả lời này. – laike9m

4

A-bên thứ ba dateutil sử dụng ngày hiện tại trong trường hợp này:

>>> from dateutil.parser import parse 
>>> time_string = "04:35:45" 
>>> parse(time_string) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

Hoặc, bạn có thể sử dụng .replace() để thiết lập các năm, tháng và ngày:

>>> datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
>>> datetime_obj.replace(year=now.year, month=now.month, day=now.day) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

Mặc dù , Tôi thực sự thích số .combine() option được đăng bởi Bruno.

+0

Tốt. Tôi có thể làm điều đó mà không có lib của bên thứ 3 không? – laike9m

+0

@ laike9m được, cập nhật, cảm ơn. – alecxe

1

Bạn có thể sử dụng datetime_obj.replace. Từ tài liệu:

Trả lại ngày giờ có cùng thuộc tính, ngoại trừ những thuộc tính được cung cấp giá trị mới theo bất kỳ đối số từ khóa nào được chỉ định.

Ví dụ:

from datetime import datetime 

time_string = "04:35:45" 

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj = datetime_obj.replace(
     year = now.year, 
     month = now.month, 
     day = now.day 
     ) 

print datetime_obj 

mà in:

2016-01-06 04:35:45 
1

Bạn chỉ có thể vượt qua thời gian như ints để datetime.replace mà không cần phải tạo ra hai đối tượng datetime:

time_sring = "12:31:33" 
hr, mn, sec = map(int, time_sring.split(":")) 
dtetime_obj = datetime.now().replace(hour=hr, minute=mn, second=sec) 
2016-01-06 12:31:33.439492 
Các vấn đề liên quan