2012-09-05 15 views
15

में फ्लोट के साथ गुणा करें मेरे पास दो तिथियां हैं और सामान्य रूप से टाइमडेल्टा की गणना कर सकती हैं।टिमडेल्टा पाइथन

लेकिन मैं जिसके परिणामस्वरूप timedelta के साथ कुछ प्रतिशत गणना करना चाहते हैं:

full_time = (100/percentage) * timdelta 

लेकिन यह है कि यह केवल interegs साथ गुणा कर सकते हैं लगता है।

int के बजाय गुणक के रूप में मैं float का उपयोग कैसे कर सकता हूं?

उदाहरण:

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 

तो int(multiplier) प्रयोग किया जाता है - सटीकता भुगतना पड़ता है।

+0

आप सही हैं, timedelta केवल गुणा या विभाजन के साथ विभाजन का समर्थन करता है, लेकिन आप अनुक्रम चरण में गणित संचालन क्यों नहीं करते हैं? सटीकता की वजह से 'full_time = pass_time * 100/int (प्रतिशत) ' –

+0

@ कोलिन ओ'कोल:' 2! = 2.3131'। तुलना करें: '571 * 2 = 1142' (** 1 9 **, 03 (3) मिनट); '571 * 2.3131 = 1320,7801' (** 22 **, 0130016 (6) मिनट)। अंतर लगभग ** 3 मिनट ** (!) –

उत्तर

22

आप कुल सेकंड और फिर से वापस करने के लिए परिवर्तित कर सकते हैं:

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

timedelta.total_seconds अजगर 2.7 से उपलब्ध है; पिछले संस्करणों पर

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

बस आपको धन्यवाद! ईमानदारी से मैं 'timedelta 'कन्स्ट्रक्टर के बारे में भूल गया। और "पिछली संगतता" के लिए धन्यवाद –

3

आप total_seconds() इस्तेमाल कर सकते हैं:

datetime.timedelta(seconds=datetime.timedelta(minutes=42).total_seconds() * 0.8) 
# => datetime.timedelta(0, 2016)