docs: def timestamp_to_datetime(string):
      """
      # >14-digit -- rest ignored
      >>> timestamp_to_datetime('2014122609501011')
      datetime.datetime(2014, 12, 26, 9, 50, 10)
  
      # 14-digit
      >>> timestamp_to_datetime('20141226095010')
      datetime.datetime(2014, 12, 26, 9, 50, 10)
  
      # 13-digit padding
      >>> timestamp_to_datetime('2014122609501')
      datetime.datetime(2014, 12, 26, 9, 50, 59)
  
      # 12-digit padding
      >>> timestamp_to_datetime('201412260950')
      datetime.datetime(2014, 12, 26, 9, 50, 59)
  
      # 11-digit padding
      >>> timestamp_to_datetime('20141226095')
      datetime.datetime(2014, 12, 26, 9, 59, 59)
  
      # 10-digit padding
      >>> timestamp_to_datetime('2014122609')
      datetime.datetime(2014, 12, 26, 9, 59, 59)
  
      # 9-digit padding
      >>> timestamp_to_datetime('201412260')
      datetime.datetime(2014, 12, 26, 23, 59, 59)
  
      # 8-digit padding
      >>> timestamp_to_datetime('20141226')
      datetime.datetime(2014, 12, 26, 23, 59, 59)
  
      # 7-digit padding
      >>> timestamp_to_datetime('2014122')
      datetime.datetime(2014, 12, 31, 23, 59, 59)
  
      # 6-digit padding
      >>> timestamp_to_datetime('201410')
      datetime.datetime(2014, 10, 31, 23, 59, 59)
  
      # 5-digit padding
      >>> timestamp_to_datetime('20141')
      datetime.datetime(2014, 12, 31, 23, 59, 59)
  
      # 4-digit padding
      >>> timestamp_to_datetime('2014')
      datetime.datetime(2014, 12, 31, 23, 59, 59)
  
      # 3-digit padding
      >>> timestamp_to_datetime('201')
      datetime.datetime(2019, 12, 31, 23, 59, 59)
  
      # 2-digit padding
      >>> timestamp_to_datetime('20')
      datetime.datetime(2099, 12, 31, 23, 59, 59)
  
      # 1-digit padding
      >>> timestamp_to_datetime('2')
      datetime.datetime(2999, 12, 31, 23, 59, 59)
  
      # 1-digit out-of-range padding
      >>> timestamp_to_datetime('3')
      datetime.datetime(2999, 12, 31, 23, 59, 59)
  
      # 0-digit padding
      >>> timestamp_to_datetime('')
      datetime.datetime(2999, 12, 31, 23, 59, 59)
  
      # bad month
      >>> timestamp_to_datetime('20131709005601')
      datetime.datetime(2013, 12, 9, 0, 56, 1)
  
      # all out of range except minutes
      >>> timestamp_to_datetime('40001965252477')
      datetime.datetime(2999, 12, 31, 23, 24, 59)
  
      # not a number!
      >>> timestamp_to_datetime('2010abc')
      datetime.datetime(2010, 12, 31, 23, 59, 59)
  
      """
  
      # pad to 6 digits
      string = pad_timestamp(string, PAD_6_UP)
  
      def clamp(val, min_, max_):
          try:
              val = int(val)
              val = max(min_, min(val, max_))
              return val
          except:
              return max_
  
      def extract(string, start, end, min_, max_):
          if len(string) >= end:
              return clamp(string[start:end], min_, max_)
          else:
              return max_
  
      # now parse, clamp to boundary
      year = extract(string, 0, 4, 1900, 2999)
      month = extract(string, 4, 6, 1, 12)
      day = extract(string, 6, 8, 1, calendar.monthrange(year, month)[1])
      hour = extract(string, 8, 10, 0, 23)
      minute = extract(string, 10, 12, 0, 59)
      second = extract(string, 12, 14, 0, 59)
  
      return datetime.datetime(year=year,
                               month=month,
                               day=day,
                               hour=hour,
                               minute=minute,
                               second=second)