def datetime_from_w3_datestring(s):
    m = extended_iso_re.match(s)
    if not m:
        raise ValueError
    d = m.groupdict()
    d['year'] = int(d['year'])
    d['month'] = int(d['month'] or 1)
    d['day'] = int(d['day'] or 1)
    d['hour'] = int(d['hour'] or 0)
    d['minute'] = int(d['minute'] or 0)
    d['fraction'] = d['fraction'] or '0'
    d['second'] = float("%s.%s" % ((d['second'] or '0'), d['fraction']))
    del d['fraction']
    if d['tzd_sign']:
        if d['tzd_sign'] == '+':
            tzd_sign = 1
        elif d['tzd_sign'] == '-':
            tzd_sign = -1
        tz_delta = datetime_delta_factory(tzd_sign * int(d['tzd_hour']),
                                          tzd_sign * int(d['tzd_minute']))
    else:
        tz_delta = datetime_delta_factory(0, 0)
    del d['tzd_sign']
    del d['tzd_hour']
    del d['tzd_minute']
    d['tzinfo'] = pytz.utc
    dt = datetime_factory(**d) + tz_delta
    return dt
We need to extend ISO syntax (as permitted by the standard) to allow
dataset/ETHPy150Open lugensa/scorched/scorched/dates.py/datetime_from_w3_datestring