Every seed bank exports slightly different column names: "AcquisitionNum" here, "accession_no" there, "Lot ID" somewhere else. A pipeline that demands exact headers dies on the first real file. The fix is role mapping: normalize each header (lowercase, strip punctuation) and match it against a list of known spellings for each role — taxon, accession, storage code, seeds sown, seeds germinated, percent, time.
The lab does exactly this in its table parser, and shows you the mapping it inferred so you can override it. When you write your own script, keep the remap function separate from everything downstream: the rest of the pipeline should only ever see canonical names.
Design rule worth copying: unknown columns pass through untouched. Substrate, treatment, collector — you don't need them for the interval math, but dropping them silently makes the output harder to audit against the input.