python datetime strptime format

Question:

I have a datetime string like:

"2016-08-15T07:50:12"

I used strptime() function in datetime module to convert the string to datetime object. My datetime format is

"%Y-%m-%dT%H:%M:%S.%f"

When I parse this above string, the function raises ValueError because of missing millisecond part in the string. How can I have datetime object with millisecond is 0 when I don’t specify it in the string?

Asked By: Thanh Kiet

||

Answers:

you need to parse the date without timezone first and add the timezone later. Unfortunately you need to subclass tzinfo for that.

you can use below code and change it accordingly with your requirements.

from datetime import datetime, timedelta, tzinfo

class FixedOffset(tzinfo):
    """offset_str: Fixed offset in str: e.g. '-0400'"""
    def __init__(self, offset_str):
        sign, hours, minutes = offset_str[0], offset_str[1:3], offset_str[3:]
        offset = (int(hours) * 60 + int(minutes)) * (-1 if sign == "-" else 1)
        self.__offset = timedelta(minutes=offset)
        # NOTE: the last part is to remind about deprecated POSIX GMT+h timezones
        # that have the opposite sign in the name;
        # the corresponding numeric value is not used e.g., no minutes
        '<%+03d%02d>%+d' % (int(hours), int(minutes), int(hours)*-1)
    def utcoffset(self, dt=None):
        return self.__offset
    def tzname(self, dt=None):
        return self.__name
    def dst(self, dt=None):
        return timedelta(0)
    def __repr__(self):
        return 'FixedOffset(%d)' % (self.utcoffset().total_seconds() / 60)

date_with_tz = "2017-01-12T14:12:06.000-0500"
date_str, tz = date_with_tz[:-5], date_with_tz[-5:]
dt_utc = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%f")
dt = dt_utc.replace(tzinfo=FixedOffset(tz))
print(dt)

For more information please visit link

If you get an ISO 8601 string like: "2016-08-15T07:50:12" easiest way I feel is using dateutil to convert it.

import dateutil.parser
yourdate = dateutil.parser.parse(datestring)
Answered By: bhushan pardhi

Probably below code snippet help that you are looking

from datetime import datetime
fmt='%Y-%m-%dT%H:%M:%S'
dt="2016-08-15T07:50:12"

datetime.strptime(dt, fmt)
datetime.datetime(2016, 8, 15, 7, 50, 12)

fmt1='%Y-%m-%dT%H:%M:%S.%f'
dt1="2016-08-15T07:50:12.34" 

datetime.strptime(dt1, fmt1)
datetime.datetime(2016, 8, 15, 7, 50, 12, 340000)

By adding a simple conditional statement you will able to achieve.

Answered By: Anil Kumar Gupta
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.