2012-05-24 39 views
8

Tôi biết rằng với chức năng timedelta bạn có thể chuyển đổi giây để h: m: s sử dụng một cái gì đó như:Python Thời gian chuyển đổi h: m: s để giây

>> import datetime 
>> str(datetime.timedelta(seconds=666)) 
'0:11:06' 

Nhưng tôi cần phải chuyển đổi h: m : s đến giây hoặc phút.

Bạn có biết một chức năng có thể thực hiện việc này không?

+0

Đầu vào nguồn của bạn là gì? Một chuỗi dấu thời gian? Một số loại đối tượng? –

+0

Bạn có nghĩa là giây hoặc phút kể từ thời đại? Hay bạn chỉ muốn trích xuất các phần giây và phút từ dấu thời gian? – Michael

+0

có thể trùng lặp: http://stackoverflow.com/questions/10049805/add-values-of-0212-0345-from-a-list-together-to-make-a-format-time-hours – jadkik94

Trả lời

12
def hms_to_seconds(t): 
    h, m, s = [int(i) for i in t.split(':')] 
    return 3600*h + 60*m + s 
+1

Đẹp và đơn giản, mặc dù tôi nghĩ bạn muốn trả về 'datetime.timedelta (giây = 3600 * h + 60 * m + s)'. –

1

Thật không may, nó không phải là tầm thường khi xây dựng một đối tượng datetime từ một chuỗi sử dụng datetime.strptime. Câu hỏi này đã được hỏi trước đây về Stack Overflow tại đây: How to construct a timedelta object from a simple string, trong đó giải pháp liên quan đến việc sử dụng python-dateutil.

Ngoài ra, nếu bạn không muốn có thêm mô-đun khác, đây là một lớp học mà bạn có thể sử dụng để phân tích một timedelta từ một chuỗi: http://kbyanc.blogspot.ca/2007/08/python-reconstructing-timedeltas-from.html

12
>>> import time, datetime 
>>> a = time.strptime("00:11:06", "%H:%M:%S") 
>>> datetime.timedelta(hours=a.tm_hour, minutes=a.tm_min, seconds=a.tm_sec).seconds 
666 

Và đây là một táo bạo lót nếu bạn đang thực sự có ý định tách qua ":"

>>> s = "00:11:06" 
>>> sum(int(i) * 60**index for index, i in enumerate(s.split(":")[::-1])) 
666 
+3

Lưu ý rằng điều này không thành công nếu số giờ vượt quá 23. –

+1

@BrendanThông thường hơn, nó sẽ thất bại nếu chuỗi được chuyển đến 'strptime' không phải là thời gian hợp lệ. –

+0

Cảm ơn bạn đã làm rõ. –

0

này hoạt động trong 2.6.4:

hours, minutes, seconds = [int(_) for _ in thestring.split(':')] 

Nếu bạn muốn biến nó trở thành một timedelta:

thetimedelta = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds) 
+0

Câu trả lời của Nolen sạch sẽ hơn nhiều - tôi không thấy hàm strptime. –

0

Tôi thậm chí không chắc chắn tôi muốn bận tâm với timedelta cho điều này

>>> pseconds = lambda hms:sum(map(lambda a,b: int(a)*b,hms.split(':'),(3600,60,1))) 
>>> pseconds('0:11:06') 
666 
+1

Tôi muốn sử dụng danh sách hiểu ở đây thay vì 'bản đồ'. Tôi nghĩ rằng nó sẽ rõ ràng hơn nhiều ... – jadkik94

+0

đúng, hầu như luôn thích danh sách hiểu bản đồ ... ở đây, nó sẽ không đơn giản hơn vì nó sẽ yêu cầu một zip trong khi bản đồ có thể xử lý nhiều chuỗi. 6 của một, nửa tá ... trông xấu xí cả hai cách –

1
>>> def tt(a): 
...  b = a.split(':') 
...  return int(b[0]) * 3600 + int(b[1]) * 60 + int(b[2]) 
... 
>>> print tt('0:11:06') 
Các vấn đề liên quan