मैं अजगर के साथ इसमें मिलीसेकंड युक्त टाइम स्ट्रिंग कैसे पार्स कर सकता हूं?


204

मैं समय / समय के साथ तारीख / समय वाले तार को पार्स करने में सक्षम हूं

>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)

मैं उस समय स्ट्रिंग को कैसे पार्स कर सकता हूं जिसमें मिलीसेकंड हो?

>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
    data_string[found.end():])
ValueError: unconverted data remains: .123

जवाबों:


317

पायथन 2.6 ने एक नया स्ट्रैपटाइम / स्ट्रैप्टम मैक्रो जोड़ा %f, जो माइक्रोसेकंड करता है। यकीन नहीं होता कि यह कहीं भी प्रलेखित है। लेकिन अगर आप 2.6 या 3.0 का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं:

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')

संपादित करें: मैं वास्तव में कभी भी timeमॉड्यूल के साथ काम नहीं करता , इसलिए मैंने इसे पहले नोटिस नहीं किया था, लेकिन ऐसा प्रतीत होता है कि time.struct_time वास्तव में मिलीसेकंड / माइक्रोसेकंड को संग्रहीत नहीं करता है। आप datetimeइस तरह का उपयोग कर बेहतर हो सकते हैं :

>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000

4
धन्यवाद docs.python.org/library/datetime.html : संस्करण 2.6 में नया: समय और डेटाटाइम ऑब्जेक्ट्स% f प्रारूप कोड का समर्थन करते हैं जो ऑब्जेक्ट में माइक्रोसेकंड की संख्या तक फैलता है, बाईं ओर छह स्थानों पर शून्य-गद्देदार होता है।
इलकिनुलस

5
Woa मैं पायथन डॉक्स को अपडेट करने की जरूरत बता सकता हूं। समय मॉड्यूल के लिए डॉक्स कुछ भी नहीं कहते हैं %f
फुनेहे

14
संस्करण 2.7.3 के रूप में पायथन डॉक्स, थोड़ा भ्रामक हैं। स्ट्रैप्टाइम के लिए,% f वास्तव में किसी भी संख्या में दशमलव स्थानों का प्रतिनिधित्व कर सकता है, न कि केवल 6, जैसा कि कोई माइक्रोसेकंड के लिए उम्मीद कर सकता है। इसलिए ऊपर दिया गया कोड 32.123 सेकंड पार्स करेगा और इसे 123,000, के रूप में संग्रहीत करेगा, जो कि हम चाहते हैं।
माइकल शीपर

9
में संख्या %fपर शून्य से गद्देदार है सही 6 दशमलव स्थानों के लिए (नहीं छोड़ा!)। १ को १००००० तक ValueError: unconverted data remains: 7
पर्स दिया

17
क्या यह सिर्फ मेरे या मिलिसकंड के बारे में सवाल था, माइक्रोसेकंड का नहीं?
प्यूरेल

12

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अभी भी अजगर 2.4.3 का उपयोग कर रहा हूं और मुझे डेटा के स्ट्रिंग को डेटाइम में बदलने का एक बेहतर तरीका खोजने की आवश्यकता है।

समाधान यदि डेटाइम% f का समर्थन नहीं करता है और बिना किसी प्रयास के / बिना आवश्यकता के है:

    (dt, mSecs) = row[5].strip().split(".") 
    dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
    mSeconds = datetime.timedelta(microseconds = int(mSecs))
    fullDateTime = dt + mSeconds 

यह इनपुट स्ट्रिंग "2010-10-06 09: 42: 52.266000" के लिए काम करता है


1
dt.replace(microsecond=int(mSecs))
haridsv

यह 2.5 और पहले के पायथन पर लागू होता है। पाइथन 2.6 स्ट्रैटेम '% f' का समर्थन करता है
19

4

कोड देने के लिए जो nstehr का उत्तर ( इसके स्रोत से ) संदर्भित करता है :

def timeparse(t, format):
    """Parse a time string that might contain fractions of a second.

    Fractional seconds are supported using a fragile, miserable hack.
    Given a time string like '02:03:04.234234' and a format string of
    '%H:%M:%S', time.strptime() will raise a ValueError with this
    message: 'unconverted data remains: .234234'.  If %S is in the
    format string and the ValueError matches as above, a datetime
    object will be created from the part that matches and the
    microseconds in the time string.
    """
    try:
        return datetime.datetime(*time.strptime(t, format)[0:6]).time()
    except ValueError, msg:
        if "%S" in format:
            msg = str(msg)
            mat = re.match(r"unconverted data remains:"
                           " \.([0-9]{1,6})$", msg)
            if mat is not None:
                # fractional seconds are present - this is the style
                # used by datetime's isoformat() method
                frac = "." + mat.group(1)
                t = t[:-len(frac)]
                t = datetime.datetime(*time.strptime(t, format)[0:6])
                microsecond = int(float(frac)*1e6)
                return t.replace(microsecond=microsecond)
            else:
                mat = re.match(r"unconverted data remains:"
                               " \,([0-9]{3,3})$", msg)
                if mat is not None:
                    # fractional seconds are present - this is the style
                    # used by the logging module
                    frac = "." + mat.group(1)
                    t = t[:-len(frac)]
                    t = datetime.datetime(*time.strptime(t, format)[0:6])
                    microsecond = int(float(frac)*1e6)
                    return t.replace(microsecond=microsecond)

        raise

2

ऊपर दिया गया DNS उत्तर वास्तव में गलत है। एसओ मिलीसेकंड के बारे में पूछ रहा है, लेकिन जवाब माइक्रोसेकंड के लिए है। दुर्भाग्य से, पायथन के पास मिलीसेकंड के लिए एक निर्देश नहीं है, बस माइक्रोसेकंड ( डॉक्टर देखें ), लेकिन आप इसे स्ट्रिंग के अंत में तीन शून्य जोड़कर और माइक्रोसेकंड के रूप में स्ट्रिंग को पार्स करके, कुछ इस तरह से कर सकते हैं:

datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')

जहां time_strसे प्रारूपित है 30/03/09 16:31:32.123

उम्मीद है की यह मदद करेगा।


2
मैंने शुरू में एक ही बात सोचा था, लेकिन जवाब और डॉक्स पर टिप्पणी देखें । यह बाएं-शून्य-गद्देदार माइक्रोसेकंड है, इसलिए .123इसे 123,000 माइक्रोसेकंड के रूप में सही ढंग से व्याख्या किया गया है
aschmied

1

मेरा पहला विचार यह था कि इसे '30 / 03/09 16: 31: 32.123 '(सेकंड और मिलीसेकंड के बीच की अवधि के बजाय एक अवधि के साथ) पास करने की कोशिश की गई थी। लेकिन यह काम नहीं किया। डॉक्स पर एक त्वरित नज़र यह इंगित करती है कि किसी भी मामले में आंशिक सेकंड की अनदेखी की जाती है ...

आह, संस्करण अंतर। इसे बग के रूप में रिपोर्ट किया गया था और अब 2.6+ में आप इसे पार्स करने के लिए "% S.% f" का उपयोग कर सकते हैं।


यह काम नहीं करता है; time.strptime सिर्फ मिलीसेकंड नहीं करता है।
DNS

1

अजगर मेलिंग सूचियों से: मिलिंगसेकंड धागा पार्सिंग । वहाँ एक फ़ंक्शन पोस्ट किया गया है जो काम पाने के लिए लगता है, हालांकि जैसा कि लेखक की टिप्पणियों में उल्लेख किया गया है यह एक हैक की तरह है। यह उठने वाले अपवाद को संभालने के लिए नियमित अभिव्यक्तियों का उपयोग करता है, और फिर कुछ गणना करता है।

आप इसे स्ट्रेप टाइम से पहले पास करने से पहले नियमित एक्सप्रेशन और कैलकुलेशन भी कर सकते हैं।


हाँ, मुझे पता है कि धागा। लेकिन मैं एक सरल तरीके की तलाश कर रहा हूं। क्या फेयरी पायथन लिब में कोई मॉड्यूल है जो मिलिसकेन्ड के साथ समय पार्सिंग करता है?
इल्किनुलस

1

अजगर 2 के लिए मैंने ऐसा किया

print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])

यह समय "% H:% M:% S" को प्रिंट करता है, दो सब्सट्रिंग (पहले और बाद में) xxxxxxx.xx और .xx के बाद के टाइम टाइम () को विभाजित करता है। मेरे मिलीसेकंड हैं जो मैं अपने "%" में दूसरा सबस्ट्रिंग जोड़ता हूं। एच:% एम:% s "

उम्मीद है कि समझ में आता है :) उदाहरण उत्पादन:

13: 31: 21.72 पलक 01


13: 31: 21.81 END ऑफ ब्लैंक 01


13: 31: 26.3 पलक 01


13: 31: 26.39 END ऑफ ब्लैंक 01


13: 31: 34.65 लेनिंग 01 शुरू


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.