Converting string into datetime
I've got a huge list of date-times like this as strings:
Jun 1 2005 1:33PM Aug 28 1999 12:00AM
I'm going to be shoving these back into proper datetime fields in a database so I need to magic them into real datetime objects.
This is going through Django's ORM so I can't use SQL to do the conversion on insert.
datetime.strptime is the main routine for parsing strings into datetimes. It can handle all sorts of formats, with the format determined by a format string you give it:
from datetime import datetime datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
datetime object is timezone-naive.
strftime.org is also a really nice reference for strftime
strptime= "string parse time"
strftime= "string format time"
- Pronounce it out loud today & you won't have to search for it again in 6 months.
Read more… Read less…
Use the third party dateutil library:
from dateutil import parser parser.parse("Aug 28 1999 12:00AM") # datetime.datetime(1999, 8, 28, 0, 0)
It can handle most date formats, including the one you need to parse. It's more convenient than
strptime as it can guess the correct format most of the time.
It's very useful for writing tests, where readability is more important than performance.
You can install it with:
pip install python-dateutil
$ python >>> import time >>> my_time = time.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p') time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1, tm_hour=13, tm_min=33, tm_sec=0, tm_wday=2, tm_yday=152, tm_isdst=-1) timestamp = time.mktime(my_time) # convert time object to datetime from datetime import datetime my_datetime = datetime.fromtimestamp(timestamp) # convert time object to date from datetime import date my_date = date.fromtimestamp(timestamp)
I have put together a project that can convert some really neat expressions. Check out timestring.
Here are some examples below:
pip install timestring
>>> import timestring >>> timestring.Date('monday, aug 15th 2015 at 8:40 pm') <timestring.Date 2015-08-15 20:40:00 4491909392> >>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date datetime.datetime(2015, 8, 15, 20, 40) >>> timestring.Range('next week') <timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880> >>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date) (datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))
Remember this and you didn't need to get confused in datetime conversion again.
String to datetime object =
datetime object to other formats =
Jun 1 2005 1:33PM
is equals to
%b %d %Y %I:%M%p
%b Month as locale’s abbreviated name(Jun)
%d Day of the month as a zero-padded decimal number(1)
%Y Year with century as a decimal number(2015)
%I Hour (12-hour clock) as a zero-padded decimal number(01)
%M Minute as a zero-padded decimal number(33)
%p Locale’s equivalent of either AM or PM(PM)
so you need strptime i-e converting
>>> dates =  >>> dates.append('Jun 1 2005 1:33PM') >>> dates.append('Aug 28 1999 12:00AM') >>> from datetime import datetime >>> for d in dates: ... date = datetime.strptime(d, '%b %d %Y %I:%M%p') ... print type(date) ... print date ...
<type 'datetime.datetime'> 2005-06-01 13:33:00 <type 'datetime.datetime'> 1999-08-28 00:00:00
What if you have different format of dates you can use panda or dateutil.parse
>>> import dateutil >>> dates =  >>> dates.append('12 1 2017') >>> dates.append('1 1 2017') >>> dates.append('1 12 2017') >>> dates.append('June 1 2017 1:30:00AM') >>> [parser.parse(x) for x in dates]
[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]
In Python >= 3.7.0,
to convert YYYY-MM-DD string to datetime object,
datetime.fromisoformat could be used.
>>> from datetime import datetime >>> date_string = "2012-12-12 10:10:10" >>> print (datetime.fromisoformat(date_string)) >>> 2012-12-12 10:10:10