2012-09-05 73 views
15

Tôi có hai ngày và có thể tính toán timedelta như bình thường.Timedelta nhân với float trong python

Nhưng tôi muốn để tính toán một số phần trăm với kết quả timedelta:

full_time = (100/percentage) * timdelta 

Nhưng có vẻ như nó chỉ có thể nhân với interegs.

Tôi làm cách nào để sử dụng float thay vì int làm hệ số?

Ví dụ:

percentage  = 43.27 
passed_time = fromtimestamp(fileinfo.st_mtime) - fromtimestamp(fileinfo.st_ctime) 
multiplier  = 100/percentage # 2.3110700254217702796394730760342 
full_time  = multiplier * passed_time # BUG: here comes exception 
estimated_time = full_time - passed_time 

Nếu được sử dụng int(multiplier) - Độ chính xác bị.

+0

Bạn đúng, timedelta chỉ hỗ trợ phép nhân hoặc chia với bộ ngắt, nhưng tại sao bạn không thực hiện các phép toán theo từng bước? 'full_time = passed_time * 100/int (phần trăm)' –

+0

@Colin O'Coal, vì độ chính xác: '2! = 2.3131'. So sánh: '571 * 2 = 1142' (** 19 **, 03 (3) phút); '571 * 2,3131 = 1320,7801' (** 22 **, 0130016 (6) phút). Sự khác biệt là khoảng ** 3 phút ** (!) –

Trả lời

22

Bạn có thể chuyển đổi với tổng giây và ngược lại:

full_time = timedelta(seconds=multiplier * passed_time.total_seconds()) 

timedelta.total_seconds có sẵn từ Python 2,7; trên các phiên bản cũ hơn sử dụng

def timedelta_total_seconds(td): 
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/float(10**6) 
+0

chỉ cảm ơn bạn! Thành thật mà nói tôi quên về constructor 'timedelta'. Và cảm ơn bạn đã "tương thích ngược") –

3

Bạn có thể sử dụng total_seconds():

datetime.timedelta(seconds=datetime.timedelta(minutes=42).total_seconds() * 0.8) 
# => datetime.timedelta(0, 2016) 
Các vấn đề liên quan