Specifically I have code that simplifies to this:
from datetime import datetime
date_string = '2009-11-29 03:17 PM'
format = '%Y-%m-%d %H:%M %p'
my_date = datetime.strptime[date_string, format]
# This prints '2009-11-29 03:17 AM'
print my_date.strftime[format]
What gives? Does Python just ignore the period specifier when parsing dates or am I doing something stupid?
ARK
7196 silver badges20 bronze badges
asked Nov 18, 2009 at 22:04
Kenan BanksKenan Banks
201k34 gold badges151 silver badges171 bronze badges
0
The Python time.strftime
docs say:
When used with the strptime[] function, the
%p
directive only affects the output hour field if the%I
directive is used to parse the hour.
Sure enough, changing your %H
to %I
makes it work.
MattDMo
97.9k20 gold badges235 silver badges228 bronze badges
answered Nov 18, 2009 at 22:07
Ned BatchelderNed Batchelder
351k71 gold badges552 silver badges649 bronze badges
3
format = '%Y-%m-%d %H:%M %p'
The format is using %H
instead of %I
. Since %H
is the "24-hour" format, it's likely just discarding the %p
information. It works just fine if you change the %H
to %I
.
answered Nov 18, 2009 at 22:09
You used %H
[24 hour format] instead of %I
[12 hour
format].
answered Nov 18, 2009 at 22:09
Tim PietzckerTim Pietzcker
318k56 gold badges494 silver badges550 bronze badges
Try replacing %H [Hour on a 24-hour clock] with %I [Hour on a 12-hour clock] ?
answered Nov 18, 2009 at 22:08
keithjgrantkeithjgrant
12.1k5 gold badges51 silver badges87 bronze badges
>>> from datetime import datetime
>>> print[datetime.today[].strftime["%H:%M %p"]]
15:31 AM
Try replacing %I
with %H
.
answered Nov 4, 2020 at 14:04
1
We can convert a string to datetime using strptime[]
function. This function is available in datetime and time modules to parse a string to datetime and time objects respectively.
Python strptime[]
Python strptime[] is a class method in datetime class. Its syntax is:
datetime.strptime[date_string, format]
Both the arguments are mandatory and should be string. This function is exactly opposite of strftime[] function, which converts datetime object to a string. We have the similar function available in time module too, where its syntax is:
time.strptime[time_string[, format]]
Here the function returns struct_time
object. If format string is not provided, it defaults to “%a %b %d %H:%M:%S %Y” which matches the formatting returned
by ctime[] function. If the input string cannot be parsed according to the provided format, then ValueError
is raised. The exception message provides clear details about the issue in parsing.
Python strptime[] format directives
Following table contains most of the commonly used format directives.
%a | Weekday as locale’s abbreviated name. | Sun, Mon, …, Sat [en_US] So, Mo, …, Sa [de_DE] |
%A | Weekday as locale’s full name. | Sunday, Monday, …, Saturday [en_US] Sonntag, Montag, …, Samstag [de_DE] |
%w | Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | 0, 1, 2, 3, 4, 5, 6 |
%d | Day of the month as a zero-padded decimal number. | 01, 02, …, 31 |
%b | Month as locale’s abbreviated name. | Jan, Feb, …, Dec [en_US] Jan, Feb, …, Dez [de_DE] |
%B | Month as locale’s full name. | January, February, …, December [en_US] Januar, Februar, …, Dezember [de_DE] |
%m | Month as a zero-padded decimal number. | 01, 02 … 12 |
%y | Year without century as a zero-padded decimal number. | 01, 02, … 99 |
%Y | Year with century as a decimal number. | 0001, 0002, … , 9999 |
%H | Hour [24-hour clock] as a zero-padded decimal number. | 01, 02, … , 23 |
%I | Hour [12-hour clock] as a zero-padded decimal number. | 01, 02, … , 12 |
%p | Locale’s equivalent of either AM or PM. | AM, PM [en_US] am, pm [de_DE] |
%M | Minute as a zero-padded decimal number. | 01, 02, … , 59 |
%S | Second as a zero-padded decimal number. | 01, 02, … , 59 |
%f | Microsecond as a decimal number, zero-padded on the left. | 000000, 000001, …, 999999 Not applicable with time module. |
%z | UTC offset in the form ±HHMM[SS] [empty string if the object is naive]. | [empty], +0000, -0400, +1030 |
%Z | Time zone name [empty string if the object is naive]. | [empty], UTC, IST, CST |
%j | Day of the year as a zero-padded decimal number. | 001, 002, …, 366 |
%U | Week number of the year [Sunday as the first day of the week] as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. | 00, 01, …, 53 |
%W | Week number of the year [Monday as the first day of the week] as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. | 00, 01, …, 53 |
%c | Locale’s appropriate date and time representation. | Tue Aug 16 21:30:00 1988 [en_US] Di 16 Aug 21:30:00 1988 [de_DE] |
%x | Locale’s appropriate date representation. | 08/16/88 [None] 08/16/1988 [en_US] 16.08.1988 [de_DE] |
%X | Locale’s appropriate time representation. | 21:30:00 [en_US] 21:30:00 [de_DE] |
%% | A literal ‘%’ character. | % |
Python strptime[] examples
Let’s look into some specific examples of strptime[] function to convert string to datetime and time objects.
String to datetime
from datetime import datetime
datetime_str = '09/19/18 13:55:26'
datetime_object = datetime.strptime[datetime_str, '%m/%d/%y %H:%M:%S']
print[type[datetime_object]]
print[datetime_object] # printed in default format
Output:
2018-09-19 13:55:26
String to date object
We can use date[] function alongwith strptime[] function to convert string to date object.
date_str = '09-19-2018'
date_object = datetime.strptime[date_str, '%m-%d-%Y'].date[]
print[type[date_object]]
print[date_object] # printed in default formatting
Output:
2018-09-19
String to time object
We can use time[] function alongwith strptime[] function to convert string to time object.
time_str = '13::55::26'
time_object = datetime.strptime[time_str, '%H::%M::%S'].time[]
print[type[time_object]]
print[time_object]
Output:
13:55:26
Python time strptime[] example
Let’s see some examples of using time module strptime[] function.
import time
time_obj = time.strptime[time_str, '%H::%M::%S']
print[type[time_obj]]
print[time_obj]
# default formatting - "%a %b %d %H:%M:%S %Y"
print[time.strptime['Wed Sep 19 14:55:02 2018']]
Output:
time.struct_time[tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=13, tm_min=55, tm_sec=26, tm_wday=0, tm_yday=1, tm_isdst=-1]
time.struct_time[tm_year=2018, tm_mon=9, tm_mday=19, tm_hour=14, tm_min=55, tm_sec=2, tm_wday=2, tm_yday=262, tm_isdst=-1]
Python strptime[] ValueError Example
We can use try-except block to catch parsing exception and perform corrective actions.
datetime_str = '09/19/18 13:55:26'
try:
datetime_object = datetime.strptime[datetime_str, '%m/%d/%y']
except ValueError as ve:
print['ValueError Raised:', ve]
time_str = '99::55::26'
try:
time_object = time.strptime[time_str, '%H::%M::%S']
except ValueError as e:
print['ValueError:', e]
Output:
ValueError Raised: unconverted data remains: 13:55:26
ValueError: time data '99::55::26' does not match format '%H::%M::%S'
Notice that the ValueError message clearly explains the root cause of the parsing exception.
Python Convert String to Datetime with locale
Let’s look at an example where a locale-specific string will be converted to datetime object. We will use locale module to set the locale to be used by python.
import locale
locale.setlocale[locale.LC_ALL, 'de_DE']
date_str_de_DE = '10-Dezember-2018 Montag' # de_DE locale
datetime_object = datetime.strptime[date_str_de_DE, '%d-%B-%Y %A']
print[datetime_object]
Output: 2018-12-10 00:00:00
You can checkout complete python script and more Python examples from our GitHub Repository.
References: datetime strptime[], time strptime[]