docs: def extractTs(d, whichtables="meas", mode="paleo"):
      """
      Create a time series using LiPD data (uses paleoData by default)
  
      | Example : (default) paleoData and meas tables
      | 1. D = lipd.readLipd()
      | 2. ts = lipd.extractTs(D)
  
      | Example : chronData and all tables
      | 1. D = lipd.readLipd()
      | 2. ts = lipd.extractTs(D, "all", "chron")
  
      :param dict d: Metadata
      :param str whichtables: "all", "summ", "meas", "ens" - The tables that you would like in the timeseries
      :param str mode: "paleo" or "chron" mode
      :return list l: Time series
      """
      # instead of storing each raw dataset per tso, store it once in the global scope. saves memory
      global _timeseries_data
      _l = []
      start = clock()
      try:
          if not d:
              print("Error: LiPD data not provided. Pass LiPD data into the function.")
          else:
              print(mode_ts("extract", mode))
              if "paleoData" in d:
                  # One dataset: Process directly on file, don't loop
                  try:
                      _dsn = get_dsn(d)
                      _timeseries_data[start] = {}
                      _timeseries_data[start][_dsn] = d
                      # Use the LiPD data given to start time series extract
                      print("extracting: {}".format(_dsn))
                      # Copy, so we don't affect the original data
                      _v = copy.deepcopy(d)
                      # Start extract...
                      _l = (extract(_v, whichtables, mode, start))
                  except Exception as e:
                      print("Error: Unable to extractTs for dataset: {}: {}".format(_dsn, e))
                      logger_start.debug("extractTs: Exception: {}, {}".format(_dsn, e))
  
              else:
                  _timeseries_data[start] = d
                  # Multiple datasets: Loop and append for each file
                  for k, v in d.items():
                      try:
                          # Use the LiPD data given to start time series extract
                          print("extracting: {}".format(k))
                          # Copy, so we don't affect the original data
                          _v = copy.deepcopy(v)
                          # Start extract...
                          _l += (extract(_v, whichtables, mode, start))
                      except Exception as e:
                          print("Error: Unable to extractTs for dataset: {}: {}".format(k, e))
                          logger_start.debug("extractTs: Exception: {}".format(e))
              print("Created time series: {} entries".format(len(_l)))
      except Exception as e:
          print("Error: Unable to extractTs: {}".format(e))
          logger_start.error("extractTs: Exception: {}".format(e))
      end = clock()
      logger_benchmark.info(log_benchmark("extractTs", start, end))
      return _l