2009-07-05 9 views
9

मैं समझता हूँ कि सेकंड और माइक्रोसेकंड शायद दक्षता कारणों के लिए datetime.timedelta में अलग से प्रतिनिधित्व कर रहे हैं, लेकिन मैं सिर्फ इस सरल समारोह लिखा है:गायब datetime.timedelta.to_seconds() -> पायथन में तैरते हैं?

def to_seconds_float(timedelta): 
    """Calculate floating point representation of combined 
    seconds/microseconds attributes in :param:`timedelta`. 

    :raise ValueError: If :param:`timedelta.days` is truthy. 

     >>> to_seconds_float(datetime.timedelta(seconds=1, milliseconds=500)) 
     1.5 
     >>> too_big = datetime.timedelta(days=1, seconds=12) 
     >>> to_seconds_float(too_big) # doctest: +ELLIPSIS 
     Traceback (most recent call last): 
     ... 
     ValueError: ('Must not have days', datetime.timedelta(1, 12)) 
    """ 
    if timedelta.days: 
     raise ValueError('Must not have days', timedelta) 
    return timedelta.seconds + timedelta.microseconds/1E6 

यह time.sleep या select.select के लिए एक मूल्य गुजर जैसी चीजों के लिए उपयोगी है। datetime.timedelta इंटरफ़ेस के इस हिस्से की तरह कुछ क्यों नहीं है? मुझे कुछ कोने का मामला याद आ रहा है। समय प्रतिनिधित्व में इतने सारे गैर-स्पष्ट कोने के मामले लगते हैं ...

मैंने कुछ परिशुद्धता पर उचित शॉट रखने के लिए दिन को खारिज कर दिया (मैं वास्तव में गणित एटीएम को काम करने के लिए बहुत आलसी हूं, इसलिए ऐसा लगता है एक उचित समझौता ;-)।

+0

प्रश्न क्या है? –

+0

इसे उकसाया - यह सोचकर कि क्या कोई कारण है कि यह इंटरफ़ेस में शामिल नहीं है। – cdleary

+2

यह https://stackoverflow.com/questions/21414639/convert-timedelta-to-floating-point का डुप्लिकेट दिखता है जिसका एक बेहतर उत्तर है। – outofculture

उत्तर

12

एक पाइथन फ्लोट में लगभग 15 महत्वपूर्ण अंक हैं, इसलिए सेकेंड 86400 (दशमलव बिंदु के बाईं ओर 5 अंक) तक और माइक्रोसॉन्ड को 6 अंकों की आवश्यकता होती है, आप दिनों को अच्छी तरह से शामिल कर सकते हैं (कई वर्षों तक के लायक) परिशुद्धता के नुकसान के बिना।

एक अच्छा मंत्र "पीआई सेकंड एक नैनोसेन्टरी है" - प्रति 100 वर्षों के बारे में 3.14E9 सेकंड, यानी प्रति वर्ष 3E7, इसलिए प्रति वर्ष 3E13 माइक्रोसेकंड। मंत्र अच्छा है क्योंकि यह यादगार है, भले ही आपको थोड़ी मानसिक अंकगणित करने की आवश्यकता होती है (लेकिन, पालक की तरह, यह आपके लिए अच्छा है - आपको चुस्त और सतर्क रखता है! -)।

datetime का डिज़ाइन दर्शन कुछ हद तक कम से कम है, इसलिए यह आश्चर्य की बात नहीं है कि यह कई संभावित सहायक विधियों को छोड़ देता है जो सरल अंकगणितीय अभिव्यक्तियों को उबालते हैं।

+0

समझा जाता है कि कई * संभावित * सहायक तरीके हैं, लेकिन यह विशेष रूप से उपयोगी है जो अन्य stdlib कार्यों के इंटरफेस दिए गए हैं - क्या आपको लगता है कि यह शामिल करने के लिए प्रस्ताव देने योग्य है? वैसे भी यह आपका कॉल होगा। ;-) – cdleary

+0

ईमानदारी से मैं पाइथन-देव पर सैकड़ों पदों के धागे के लिए समय नहीं बनाता - यह बहुत समय लेने वाला बन गया है :-(। मुझे सुझाव है कि आप पाइथन-विचारों पर जाएं और कोशिश करें अतिरिक्त सहायक विधियों के एक सेट के साथ एक पीईपी को एक साथ रखना जो लोकप्रिय साबित नहीं हो सकता है और विवादास्पद नहीं है (मेरा पसंदीदा पसंदीदा टोटेमेस्टैम्प विधि होगा - केवल सेटाइमेस्टैम्प बेतुका है!), फिर इसे पायथन-देव और * बतख पर हवा दें * ! -) –

+0

मुझे पालक टिप्पणी के लिए आपको वोट देना चाहिए। :) मुझे मंत्र बीटीडब्ल्यू पसंद है, इसलिए मैंने इसके बजाय मतदान किया। – Scott

3

परिशुद्धता के लिए आपकी चिंता गलत है। यहाँ एक सरल दो लाइनर मोटे तौर पर गणना करने के लिए कितने साल आप क्या एक IEEE754 64-बिट नाव में precsion के 53 बिट के बचा है में निचोड़ कर सकते हैं:

>>> import math 
>>> 10 ** (math.log10(2 ** 53) - math.log10(60 * 60 * 24) - 6)/365.25 
285.42092094268787 
>>> 

दौर बंद के लिए बाहर देखो; सबसे छोटी गैर-शून्य संख्याएं जोड़ें:

return timedelta.seconds + timedelta.microseconds/1E6 + timedelta.days * 86400 
+0

मुझे यकीन नहीं है कि यह गलत है - यहां तक ​​कि यह जानने के लिए, अब आपको यह निर्धारित करना होगा कि कितने दिनों की अनुमति है <= 285 (जो लोगों को याद रखने के लिए एक सुंदर अजीब प्रतिबंध संख्या है) उन्हें नियम के रूप में अस्वीकार करने से बेहतर है (याद करने के लिए आसान)। हालांकि इसकी गणना करने के लिए धन्यवाद - यह वह काम है जिसे मैं पहली जगह से बचने की उम्मीद कर रहा था। :-) – cdleary

+0

मेरे उत्तर का बिंदु यह था कि यदि आप 280-सालों में जोड़ते हैं तो आपके पास अभी भी माइक्रोसॉन्ड परिशुद्धता हो सकती है। हालांकि, जो लोग वर्षों से काम कर रहे हैं, वे शायद माइक्रोसॉन्ड के बारे में परवाह नहीं करते हैं। क्या प्रतिबंध?निश्चित रूप से आप अपने कोड में 285 साल की जांच करने की योजना नहीं बना रहे थे? शीश * 2 ** 53 !! यदि टाइमडेल्टा 300 * 366 दिन कहता है और सेकंड और माइक्रोसेकंड शून्य होते हैं, तो कोई सटीकता नहीं खो जाएगी। याद रखें कि फ़्लोटिंग के लिए एफ छोटा है, फिक्स्ड नहीं। –

+0

मैं समझता हूं, मैंने सोचा कि यह गणना कर रहा है कि फ्लाई पर सटीक पर्याप्त था या नहीं, यह सबसे महत्वपूर्ण आयाम में सीमित करने से काफी जटिल था। (यह जानना भी आसान है कि त्रुटि स्थिति को कैसे ठीक किया जाए।) मुझे लगता है कि आप सही हैं, हालांकि - अगर मैं इस समारोह को और अधिक गंभीर बनाना चाहता हूं तो मैं यह निर्धारित करते समय वैल्यूएरर बढ़ा सकता हूं कि मैं आवश्यक परिशुद्धता को पूरा नहीं कर सकता उपयोगकर्ता वहां से इसके साथ सौदा करता है। – cdleary

संबंधित मुद्दे