72

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?

Alexey Sh.
  • 1,734
  • 2
  • 22
  • 34
  • 2
    Have you looked at [dateutil](https://labix.org/python-dateutil) - failing that - just try `strptime`ing each 3 in turn to see if they work, otherwise fail... – Jon Clements May 10 '14 at 12:37
  • 1
    Thank you for the comment.I want use pure python without third party libs – Alexey Sh. May 10 '14 at 12:38

5 Answers5

171

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')
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
  • 2
    what if we have huge data and multiple date formats, then looping through a loop is feasible in terms of time complexity? will it not be slow? – Taylor Apr 01 '20 at 08:36
52
>>> 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.

khan
  • 7,005
  • 15
  • 48
  • 70
2

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 --> ): ")
Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
1

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

juanm55
  • 1,679
  • 1
  • 12
  • 9
-6

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.

DaveL17
  • 1,673
  • 7
  • 24
  • 38
Gabriel M
  • 710
  • 4
  • 7