14

I have a text file with a lot of datetime strings in isoformat. The strings are similar to this:

'2009-02-10 16:06:52.598800'

These strings were generated using str(datetime_object). The problem is that, for some reason, str(datetime_object) generates a different format when the datetime object has microseconds set to zero and some strings look like this:

'2009-02-10 16:06:52'

How can I parse these strings and convert them into a datetime object?

It's very important to get all the data in the object, including microseconds.

NOTE: I have to use Python 2.5, the format directive %f for microseconds doesn't exist in 2.5.

4 Answers 4

21

Alternatively:

from datetime import datetime

def str2datetime(s):
    parts = s.split('.')
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S")
    return dt.replace(microsecond=int(parts[1]))

Using strptime itself to parse the date/time string (so no need to think up corner cases for a regex).

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for this answer! I'd suggest to change the last line to: return dt.replace(microsecond=int(1000 * float( '0.' + parts[1]))) this handles all cases correctly, like e.g. '2017-03-16 21:20:57.31' which should give 310us rather than 31us.
11

Use the dateutil module. It supports a much wider range of date and time formats than the built in Python ones.

You'll need to easy_install dateutil for the following code to work:

from dateutil.parser import parser

p = parser()
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800')
print datetime_with_microseconds.microsecond

results in:

598799

Comments

5

Someone has already filed a bug with this issue: Issue 1982. Since you need this to work with python 2.5 you must parse the value manualy and then manipulate the datetime object.

Comments

2

It might not be the best solution, but you can use a regular expression:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr)
dt = datetime.datetime(*[int(x) for x in m.groups() if x])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.