পাইথনের সাথে মিলিসেকেন্ডযুক্ত টাইম স্ট্রিংকে আমি কীভাবে পার্স করতে পারি?


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

পাইথন ২.6 একটি নতুন স্ট্রফটাইম / স্ট্রপটাইম ম্যাক্রো যুক্ত করেছে %f, যা মাইক্রোসেকেন্ড করে। এটি কোথাও নথিভুক্ত কিনা তা নিশ্চিত নয়। তবে আপনি যদি 2.6 বা 3.0 ব্যবহার করেন তবে আপনি এটি করতে পারেন:

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

সম্পাদনা: আমি সত্যিই timeমডিউলটির সাথে কখনই কাজ করি না , তাই আমি প্রথমে এটি লক্ষ্য করিনি, তবে এটি প্রদর্শিত হয় 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
ধন্যবাদ ডকস.পাইথন.আর.লিবারি / ডেটটাইম.ইচটিএমএল : সংস্করণ ২.6 এ নতুন: সময় এবং তারিখের সময় অবজেক্টগুলি একটি% f ফর্ম্যাট কোড সমর্থন করে যা বস্তুর মাইক্রোসেকেন্ডের সংখ্যায় প্রসারিত হয়, বামে শূন্য প্যাডযুক্ত ছয়টি স্থানে to
ইলকিনুলাস

5
ওয়াও আমি পাইথন ডক্সকে আপডেট করার প্রয়োজন বলতে পারি। সময় মডিউলটির জন্য দস্তাবেজগুলি সম্পর্কে কিছুই বলে না %f
ফুনেহে

14
২.7.৩ সংস্করণ অনুযায়ী পাইথন ডক্সটি কিছুটা বিভ্রান্তিকর। স্ট্রাইপটাইমের জন্য,% f কেবলমাত্র 6 টি নয়, যে কোনও দশমিক স্থানে সংখ্যক প্রতিনিধিত্ব করতে পারে যেমন কেউ মাইক্রোসেকেন্ডের জন্য আশা করতে পারে। সুতরাং উপরের কোডটি 32.123 সেকেন্ডকে বিশ্লেষণ করবে এবং এটি 123,000 এর হিসাবে সংরক্ষণ করবে, যা আমরা চাই।
মাইকেল শ্যাপার

9
সংখ্যাটি ডানদিকে%f শূন্যযুক্ত (বাম নয়!) থেকে 6 দশমিক স্থানে প্যাডযুক্ত । 1 100000 এ পার্স করা হয়, 12 কে 120000 এ পার্স করা হয়, এবং 1234567 উত্পাদিত হয়ValueError: unconverted data remains: 7
ব্যবহারকারী 443854

17
এটি কি আমিই নাকি মাইক্রোসেকেন্ড নয় মিলিসেকেন্ড সম্পর্কে প্রশ্ন ছিল?
পার্লেল

12

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি এখনও পাইথন ২.৪.৩ ব্যবহার করছি এবং ডেটা স্ট্রিংকে ডেট টাইমে রূপান্তর করার জন্য আমার আরও ভাল উপায় খুঁজে নেওয়া দরকার।

সমাধান যদি ডেটটাইম% 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 এবং এর আগেরটির জন্য প্রযোজ্য। পাইথন ২.6 স্ট্রপটাইম '% এফ' সমর্থন করে
স্মিচ

4

কোড দেওয়ার জন্য যে এনস্টেহর এর উত্তর উল্লেখ করেছে ( এর উত্স থেকে ):

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

উপরের ডিএনএস উত্তর আসলে ভুল is এসও মিলিসেকেন্ড সম্পর্কে জিজ্ঞাসা করছে তবে উত্তরটি মাইক্রোসেকেন্ডের জন্য। দুর্ভাগ্যক্রমে, পাইথনসের মিলি সেকেন্ডের জন্য কোনও নির্দেশনা নেই, কেবল মাইক্রোসেকেন্ডস ( ডক দেখুন ), তবে আপনি স্ট্রিংয়ের শেষে তিনটি শূন্য যুক্ত করে স্ট্রিংটিকে মাইক্রোসেকেন্ড হিসাবে বিভক্ত করে এটির মতো কাজ করতে পারেন:

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 '(সেকেন্ড এবং মিলিসেকেন্ডের মধ্যে একটি কোলনের পরিবর্তে সময়কাল সহ) দিয়ে যাওয়ার চেষ্টা করা হয়েছিল But তবে এটি কার্যকর হয়নি। দস্তাবেজগুলিতে একটি তাত্ক্ষণিক দৃষ্টিভঙ্গি ইঙ্গিত দেয় যে ভগ্নাংশের সেকেন্ড কোনও ক্ষেত্রে উপেক্ষা করা হচ্ছে ...

আহ, সংস্করণ পার্থক্য। এটি একটি বাগ হিসাবে রিপোর্ট করা হয়েছিল এবং এখন ২.6+ এ পার্স করার জন্য আপনি "% S%%" ব্যবহার করতে পারেন।


এটি কাজ করে না; টাইম.স্ট্রিপটাইম শুধু মিলিসেকেন্ড করে না।
ডিএনএস

1

পাইথন মেলিং তালিকা থেকে: মিলিসেকেন্ড থ্রেড পার্সিং । সেখানে একটি ফাংশন পোস্ট করা হয়েছে যা দেখে মনে হয় কাজটি শেষ হবে, যদিও লেখকের মন্তব্যে এটি উল্লেখ করা হয়েছে এটি হ্যাকের মতো। এটি উত্থাপিত ব্যতিক্রমগুলি পরিচালনা করতে নিয়মিত এক্সপ্রেশন ব্যবহার করে এবং তারপরে কিছু গণনা করে।

আপনি স্ট্রপটাইমে পাস করার আগে সামনে নিয়মিত এক্সপ্রেশন এবং গণনা করার চেষ্টা করতে পারেন।


হ্যাঁ, আমি সেই সুতো জানি। তবে আমি একটি সহজ উপায় খুঁজছি। স্ট্যান্ডার্ড পাইথন লাইবে এমন কোনও মডিউল রয়েছে যা সময়টিকে মিলিসেকেন্ডগুলির সাথে পার্সিং করে?
ইলকিনুলস

1

অজগর 2 এর জন্য আমি এটি করেছি

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

এটি "% এইচ:% এম:% এস" সময় প্রিন্ট করে, টাইম.টাইম () কে দুটি সাবস্ট্রিংয়ে বিভক্ত করে (আগে এবং পরে।) এইচ:% এম:% s "

আশা করি যে উপলব্ধি করা হয়েছে :) উদাহরণ আউটপুট:

13: 31: 21.72 ঝলক 01


13: 31: 21.81 বিউব 01 এর সমাপ্তি


13: 31: 26.3 ঝলক 01


13: 31: 26.39 বিউব 01 এর সমাপ্তি


13: 31: 34.65 লেন 01 শুরু হচ্ছে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.