How can I parse a time string containing milliseconds in it with python? How can I parse a time string containing milliseconds in it with python? python python

How can I parse a time string containing milliseconds in it with python?


Python 2.6 added a new strftime/strptime macro %f. The docs are a bit misleading as they only mention microseconds, but %f actually parses any decimal fraction of seconds with up to 6 digits, meaning it also works for milliseconds or even centiseconds or deciseconds.

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

However, time.struct_time doesn't actually store milliseconds/microseconds. You're better off using datetime, like this:

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

As you can see, .123 is correctly interpreted as 123 000 microseconds.


I know this is an older question but I'm still using Python 2.4.3 and I needed to find a better way of converting the string of data to a datetime.

The solution if datetime doesn't support %f and without needing a try/except is:

    (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 

This works for the input string "2010-10-06 09:42:52.266000"


To give the code that nstehr's answer refers to (from its source):

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