def _datetime_from_str(time_str): """Return (, ) for the given datetime string. >>> _datetime_from_str("2009") ('year', datetime.datetime(2009, 1, 1, 0, 0)) >>> _datetime_from_str("2009-12") ('month', datetime.datetime(2009, 12, 1, 0, 0)) >>> _datetime_from_str("2009-12-25") ('day', datetime.datetime(2009, 12, 25, 0, 0)) >>> _datetime_from_str("2009-12-25 13") ('hour', datetime.datetime(2009, 12, 25, 13, 0)) >>> _datetime_from_str("2009-12-25 13:05") ('minute', datetime.datetime(2009, 12, 25, 13, 5)) >>> _datetime_from_str("2009-12-25 13:05:14") ('second', datetime.datetime(2009, 12, 25, 13, 5, 14)) >>> _datetime_from_str("2009-12-25 13:05:14.453728") ('microsecond', datetime.datetime(2009, 12, 25, 13, 5, 14, 453728)) """ import time import datetime formats = [ # , , ("year", "YYYY", "%Y"), ("month", "YYYY-MM", "%Y-%m"), ("day", "YYYY-MM-DD", "%Y-%m-%d"), ("hour", "YYYY-MM-DD HH", "%Y-%m-%d %H"), ("minute", "YYYY-MM-DD HH:MM", "%Y-%m-%d %H:%M"), ("second", "YYYY-MM-DD HH:MM:SS", "%Y-%m-%d %H:%M:%S"), # "." at end is manually handled below ("microsecond", "YYYY-MM-DD HH:MM:SS", "%Y-%m-%d %H:%M:%S"), ] for scope, pattern, format in formats: if scope == "microsecond": # Special handling for microsecond part. AFAIK there isn't a # strftime code for this. if time_str.count('.') != 1: continue time_str, microseconds_str = time_str.split('.') try: microsecond = int((microseconds_str + '000000')[:6]) except ValueError: continue try: # This comment here is the modern way. The subsequent two # lines are for Python 2.4 support. #t = datetime.datetime.strptime(time_str, format) t_tuple = time.strptime(time_str, format) t = datetime.datetime(*t_tuple[:6]) except ValueError: pass else: if scope == "microsecond": t = t.replace(microsecond=microsecond) return scope, t else: raise ValueError("could not determine date from %r: does not " "match any of the accepted patterns ('%s')" % (time_str, "', '".join(s for s,p,f in formats)))