docs: def gsod_day_parser(line, SI=True, to_datetime=True):
      '''One line (one file) parser of data in the format of the GSOD database.
      Returns all parsed results as a namedtuple for reduced memory consumption.
      Will convert all data to base SI units unless the `SI` flag is set to 
      False. As the values are rounded to one or two decimal places in the
      GSOD database in Imperial units, it may be useful to look at the values
      directly. 
      
      The names columns of the columns in the GSOD database are retained and used
      as the attributes of the namedtuple results.
      
      The day, month, and year are normally converted to a datetime instance in
      resulting namedtuple; this behavior can be disabled by setting the 
      `datetime` flag to False; it will be a string in the format YYYYMMDD if so.
      This may be useful because datetime conversion roughly doubles the speed of
      this function.
      
      Parameters
      ----------
      line : str
          Line in format of GSOD documentation, [-]
      SI : bool
          Whether or not the results get converted to base SI units, [-] 
      to_datetime : bool
          Whether or not the date gets converted to a datetime instance or stays
          as a string, [-]
  
      Returns
      -------
      gsod_day_instance : gsod_day
          namedtuple with fields described in the source (all values in SI units,
          if `SI` is True, i.e. meters, m/s, Kelvin, Pascal; otherwise the 
          original unit set is used), [-]
      '''    
      # Ignore STN--- and WBAN, 8-12 characters
      fields = line.strip().split()[2:]
      # For the case the field is blank, set it to None; strip it either way 
      for i in range(len(fields)):
          field = fields[i].strip()
          if not field:
              field = None
          fields[i] = field 
  
      obj = dict(zip(gsod_fields, fields))
      # Convert the date to a datetime object if specified
      if to_datetime and obj['DATE'] is not None:
          obj['DATE'] = datetime.datetime.strptime(obj['DATE'], '%Y%m%d')
                  
      # Parse float values as floats
      for field in gsod_float_fields:
          value = obj[field].rstrip(gsod_flag_chars)
          if value in gsod_bad_values:
              value = None
          else:
              value = float(value)
          obj[field] = value
          
      if SI:
          # All temperatures are in deg F
          for field in ('TEMP', 'DEWP', 'MAX', 'MIN'):
              value = obj[field]
              if value is not None:
                  # F2K inline for efficiency unfortunately
                  obj[field] = (value + 459.67)*five_ninths
  
          # Convert visibility, wind speed, pressures
          # to si units of meters, Pascal, and meters/second.
          if obj['VISIB'] is not None:
              obj['VISIB'] = obj['VISIB']*mile
          if obj['PRCP'] is not None:
              obj['PRCP'] = obj['PRCP']*inch
          if obj['SNDP'] is not None:
              obj['SNDP'] = obj['SNDP']*inch
          if obj['WDSP'] is not None:
              obj['WDSP'] = obj['WDSP']*knot 
          if obj['MXSPD'] is not None:
              obj['MXSPD'] = obj['MXSPD']*knot
          if obj['GUST'] is not None:
              obj['GUST'] = obj['GUST']*knot
          if obj['SLP'] is not None:
              obj['SLP'] = obj['SLP']*100.0
          if obj['STP'] is not None:
              obj['STP'] = obj['STP']*100.0
  
      # Parse int values as ints
      for field in gsod_int_fields:
          value = obj[field] 
          if value is not None:
              obj[field] = int(value)
  
      indicator_values = [flag == '1' for flag in obj['FRSHTT']]
      obj.update(zip(gsod_indicator_names, indicator_values))
      return gsod_day(**obj)