Package: datetime-glob
datetime-globParses date/times from a path given a glob pattern intertwined with date/time format akin to strptime/strftime format.datetime.datetime.strptime suffices for simple date/time parsing. However, as soon as you need to handle wildcards,
it becomes tricky and you need to resort to regular expressions.We found the glob patterns and strptime format to be far easier to read and write than regular expressions, and
encapsulated the logic involving regular expressions in this module.InstallationCreate a virtual environment:python3-mvenvvenv3Activate it:sourcevenv3/bin/activateInstall datetime-glob with pip:pip3installdatetime-globUsageTo match a path:>>>importdatetime_glob>>>matcher=datetime_glob.Matcher(pattern='/some/path/*%Y-%m-%dT%H-%M-%SZ.jpg')>>>match=matcher.match(path='/some/path/some-text2016-07-03T21-22-23Z.jpg')>>>matchdatetime_glob.Match(year=2016,month=7,day=3,hour=21,minute=22,second=23)>>>match.as_datetime()datetime.datetime(2016,7,3,21,22,23)>>>match.as_date()datetime.date(2016,7,3)>>>match.as_time()datetime.time(21,22,23)If you specify a directive for the same field twice, the matcher will make sure that the field has the same semantical
value in order to match:>>>importdatetime_glob>>>matcher=datetime_glob.Matcher(pattern='/some/path/%y/%Y-%m-%d.txt')>>>match=matcher.match(path='/some/path/16/2016-07-03.txt')>>>matchdatetime_glob.Match(year=2016,month=7,day=3)>>>match=matcher.match(path='/some/path/19/2016-07-03.txt')>>>type(match)<class'NoneType'>You can walk the pattern on the file system:importdatetime_globformatch,pathindatetime_glob.walk(pattern='/some/path/*%Y/%m/%d/%H-%M-%SZ.jpg'):dtime=match.as_datetime()print(dtime,path)2016-03-0412:13:14/some/path/saved-2016/03/04/12-13-14Z.jpg2017-11-2322:23:24/some/path/restored-2017/11/23/22-23-24Z.jpgTo iterate manually over a tree, and match incrementally each path segment by yourself:>>>importdatetime_glob>>>pattern_segments=datetime_glob.parse_pattern(pattern='/some/path/*%Y/%m/%d/%H-%M-%SZ.jpg')>>>match=datetime_glob.Match()>>>match=datetime_glob.match_segment(segment='some',pattern_segment=pattern_segments[0],match=match)>>>matchdatetime_glob.Match()>>>match=datetime_glob.match_segment(segment='path',pattern_segment=pattern_segments[1],match=match)>>>matchdatetime_glob.Match()>>>match=datetime_glob.match_segment(segment='some-text2016',pattern_segment=pattern_segments[2],match=match)>>>matchdatetime_glob.Match(year=2016)>>>match=datetime_glob.match_segment(segment='07',pattern_segment=pattern_segments[3],match=match)>>>matchdatetime_glob.Match(year=2016,month=7)>>>match=datetime_glob.match_segment(segment='03',pattern_segment=pattern_segments[4],match=match)>>>matchdatetime_glob.Match(year=2016,month=7,day=3)>>>match=datetime_glob.match_segment(segment='21-22-23Z.jpg',pattern_segment=pattern_segments[5],match=match)>>>matchdatetime_glob.Match(year=2016,month=7,day=3,hour=21,minute=22,second=23)Supported strftime directives(subset fromhttps://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)DirectiveMeaningExample%dDay of the month as a zero-padded decimal number.01, 02, …, 31%-dDay of the month as a decimal number.1, 2, …, 31%mMonth as a zero-padded decimal number.01, 02, …, 12%-mMonth as a  decimal number.1, 2, …, 12%yYear without century as a zero-padded decimal number.00, 01, …, 99%YYear with century as a decimal number.1970, 1988, 2001, 2013%HHour (24-hour clock) as a zero-padded decimal number.00, 01, …, 23%-HHour (24-hour clock) as a decimal number.0, 1, …, 23%MMinute as a zero-padded decimal number.00, 01, …, 59%-MMinute as a decimal number.0, 1, …, 59%SSecond as a zero-padded decimal number.00, 01, …, 59%-SSecond as a decimal number.0, 1, …, 59%fMicrosecond as a decimal number, zero-padded on the left.000000, 000001, …, 999999%%A literal ‘%’ character.%DevelopmentCheck out the repository.In the repository root, create the virtual environment:python3-mvenvvenv3Activate the virtual environment:sourcevenv3/bin/activateInstall the development dependencies:pip3install-e.[dev]Runprecommit.pyto execute pre-commit checks locally.