The time axis of the whole analysis is YearsDifference: the accession's age, in whole years, at the moment each germination test started. Most databases don't store it — they store a collection date on the accession and a test-start date on each test. So the pipeline offers a preprocessing step: if YearsDifference is missing, compute it as (test date − collection date) ÷ 365.25, rounded half-up (0.5 → 1, 0.4 → 0).
The ugly part is date parsing. Real exports mix ISO dates, US slash dates, day-month-name strings, and — the classic — raw Excel serial numbers (days since 1899-12-30). A robust parser tries formats in order and only gives up when nothing matches. If YearsDifference is partially present, fill only the gaps; never overwrite values the bank computed themselves without being told to.
Whole-year rounding is a modeling decision, not an accident: monitoring tests cluster around anniversaries, and integer years make "latest year meeting the threshold" unambiguous. If your bank tests on a finer schedule, you can keep fractional years — but then define what "the same year" means before you collapse replicates.