This article will solve a commonly faced problem to extract various components such as day, month, year, hour, minute, second from  a date in string format in python with examples.
Python’s datetime module will be used for converting a string to a date which will provide all these components.

Problem
Suppose you have a string such as ‘2020-02-01’  and you want to get year, month and date from it, may be to compare it with some other value or for displaying these values.
One way is to split the string and then get the values but this is not an elegant solution.
Python datetime module
Python’s `datetime` module provides a `datetime` class which contains `strptime` method. This method accepts 2 string arguments.
1. Date to be parsed.
2. Format of the date.
and returns a datetime object.
This object contains different properties that return the components of the date supplied as a string.
Format of the date consist of pre-defined directives and should match the date given in string format. Examples of dates and their corresponding formats is given below,

DateTimeFormat
2020-15-02%Y-%d-%m
2020/02/15%y/%m/%d
15-02-99%d-%m-%y
2020-15-02 11:10:09%Y-%d-%m %H:%M:%S

where %Y stands for full year, %y is for year without century, %m is for month, %d is for date, %H, %M and %S stand for hour, month and second respectively.
Above explanation can be easily understood through below illustration.

A complete list of valid directives is given below.

strptime example
Using `strptime` method to convert a string to date and then extract individual components is given below.

```import datetime

date_str = "2020-15-02 11:20:09"
format = "%Y-%d-%m %H:%M:%S"
dt = datetime.datetime.strptime(date_str, format)
print("Type of value returned by strptime:", type(dt))

print("Day:",dt.day)
print("Year:",dt.year)
print("Hour:",dt.hour)
print("Month:",dt.month)
print("Minute:",dt.minute)
print("Second:",dt.second)```

Output of above code is

Type of value returned by strptime: <class ‘datetime.datetime’>
Day: 15
Year: 2020
Month: 2
Hour: 11
Minute: 20
Second: 9

Notice the type of object returned by `strptime` method. It is of type `datetime` class inside `datetime` module written as `datetime.datetime`.
Also, `day`, `year`, `month`, `year`, `hour`, `minute` and `second` properties of `datetime` object return the corresponding values of the input date components.
Default datetime value
If you try to print datetime object, then it will print date and time values in default format which is

YYYY-mm-dd HH:MM:SS

Default separator will be “-“. It does not matter if you provide any other separator in your format.
Thus, in above example, if we print the datetime object, then it will print

2020-02-15 11:20:09

If you omit the year, then it will print 1900.
If you omit the month or day, then it will print 01.
If you omit any of the time components, then they will be printed as 00.
These are the default values assumed by `datetime` method.
`01-01-1900 00:00:00` is known as epoch date.
Parsing month in words format
Above example had month in numeric format such as 02. If the string date is of the form “2020-15-Feb”. Format directive in this case will be `%b` instead of `%m`. Example,

```import datetime

date_str = "2020-15-Feb"
format = "%Y-%d-%b"
dt = datetime.datetime.strptime(date_str, format)
print("Type of value returned by strptime:", type(dt))

print("Day:",dt.day)
print("Year:",dt.year)
print("Month:",dt.month)```

Output

Type of value returned by strptime: <class ‘datetime.datetime’>
Day: 15
Year: 2020
Month: 2

Note that the month field returns an integer which is the numeric equivalent of month number such as 1 for January, 2 for February and so on.
If the month name is written in full, such as February, then you need to use `%B` instead of `%b`.
Using Invalid date
If the input date contains invalid values according to the format provided, then `strptime` method raises a ValueError.
For example, if month value is greater than 12 or date is greater than the number of days in the month or the format does not match the input date format etc., then ValueError will be thrown.

```import datetime

str = '2020-30-02 11:20:09'

dt = datetime.datetime.strptime(str,'%Y-%d-%m %H:%M:%S')```

Above code will throw an error

ValueError: day is out of range for month

since February does not contain 30 days.

```import datetime

str = '2020-15-13 11:20:09'

dt=datetime.datetime.strptime(str,'%Y-%d-%m %H:%M:%S')```

ValueError: time data ‘2020-15-13 11:20:09’ does not match format ‘%Y-%d-%m %H:%M:%S’

since number of months can not be more than 12.

```import datetime

str = '2020-15-13'

dt=datetime.datetime.strptime(str,'%Y/%d/%m')```

ValueError: time data ‘2020-15-13’ does not match format ‘%Y/%d/%m’

since the separator between the date and format do not match.
Valid directives list
Following are the most commonly used directives for describing the format of date to strptime method.

DirectiveDescriptionExample
`%a`Short form for week day.Sun. Mon, Tue
`%A`Full name for week day.Sunday, Monday
`%w`Week day as number from 0 to 6 for Sunday to Saturday respectively.0, 1 etc.
`%y`Year in 2 digits(without century).99, 00, 20
`%Y`Year in 4 digits(with century).1999, 2000, 2020
`%I`Hour(12 hour clock).12, 01, 05,
`%H`Hour(24 hour clock).00, 01, 22
`%m`Month in numeric format. Valid values from 1 to 12.01, 02, 12
`%b`Short form of month in alphabets.Jan, Feb etc.
`%B`Full form of month in alphabets.January, February etc.
`%d`Day of month with valid values from 1 to 31.01, 15 etc.
`%M`Minutes. Valid value is from 0 to 59.20, 30 etc.
`%S`Seconds. Valid value is from 0 to 59.25, 55 etc.
`%p`AM or PM.
`%Z`Timezone.UTC, GMT