How to format date string via multiple formats in python

PythonDateDatetimeFormatStrptime

Python Problem Overview


I have three date formats: YYYY-MM-DD, DD.MM.YYYY, DD/MM/YYYY.

Is it possible to validate and parse strings such as 2014-05-18 or 18.5.2014 or 18/05/2019?

Python Solutions


Solution 1 - Python

Try each format and see if it works:

from datetime import datetime

def try_parsing_date(text):
    for fmt in ('%Y-%m-%d', '%d.%m.%Y', '%d/%m/%Y'):
        try:
            return datetime.strptime(text, fmt)
        except ValueError:
            pass
    raise ValueError('no valid date format found')

Solution 2 - Python

>>> import dateutil.parser
>>> dateutil.parser.parse(date_string)

This should take care of most of the standard date formats in Python 2.7+. If you really have super custom date formats, you can always fall back to the one mentioned by Jon Clements.

Solution 3 - Python

This actually a problem i was facing and this how i approached it, my main purpose was to the date seperators

class InputRequest:
     "This class contain all inputs function that will be required in this program. "

      def __init__(self, stockTickerName = 'YHOO', stockSite='yahoo', startDate = None, 
             endDate = datetime.date.today()):

      def requestInput(self, requestType =''):
          "Fro requesting input from user"
          self.__requestInput = input(requestType)
          return self.__requestInput


def dateFormat(self, dateType=''):
    '''
        this function handles user date input
        this repeats until the correct format is supplied
        dataType: this is the type of date, eg: DOF, Date of Arriveal, etc 

    '''
    while True:
        try:
            dateString = InputRequest.requestInput(self,dateType)
            dtFormat = ('%Y/%m/%d','%Y-%m-%d','%Y.%m.%d','%Y,%m,%d','%Y\%m\%d') #you can add extra formats needed
            for i in dtFormat:
                try:
                    return datetime.datetime.strptime(dateString, i).strftime(i)
                except ValueError:
                    pass
                
        except ValueError:
            pass
        print('\nNo valid date format found. Try again:')
        print("Date must be seperated by either [/ - , . \] (eg: 2012/12/31 --> ): ")

Solution 4 - Python

In order to add a bit to @jon-clements already great answer,

added some verbosity on the exception raised for traceability purposes

from datetime import datetime

def try_parsing_date(possible_date, field):
	"""
	Try to parse a date using several formats, warn about
	problematic value if the possible_date does not match
	any of the formats tried
	"""
	for fmt in ('%Y-%m-%d', '%d/%m/%Y', '%m/%d/%Y'):
		try:
			return datetime.strptime(possible_date, fmt)
		except ValueError:
			pass
	raise ValueError(f"Non-valid date format for field {field}: '{possible_date}'")

Here, possible_date is the text that may contain a date in one of the formats, and field would be the variable or column that you are testing. This makes it easier to find the problematic value

Solution 5 - Python

Pure python:

from datetime import datetime
my_datetime = datetime.strptime('2014-05-18', '%Y-%m-%d') 
repr(my_datetime)

>>> 'datetime.datetime(2014,5,18,0,0)'

Check datetime.strptime() format documentation for more format strings.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexey Sh.View Question on Stackoverflow
Solution 1 - PythonJon ClementsView Answer on Stackoverflow
Solution 2 - PythonkhanView Answer on Stackoverflow
Solution 3 - Pythonuser3615696View Answer on Stackoverflow
Solution 4 - Pythonjuanm55View Answer on Stackoverflow
Solution 5 - PythonGabriel MView Answer on Stackoverflow