diff --git a/benchseries/benchseries.go b/benchseries/benchseries.go
index 8b7f110..cdf1e30 100644
--- a/benchseries/benchseries.go
+++ b/benchseries/benchseries.go
@@ -197,17 +197,17 @@
 
 // NormalizeDateString converts dates in two formats used in bent/benchmarking
 // into UTC, so that all sort properly into a single order with no confusion.
-func NormalizeDateString(in string) string {
+func NormalizeDateString(in string) (string, error) {
 	if noPuncDate.MatchString(in) {
 		//20211229T213212
 		//2021-12-29T21:32:12
 		in = in[0:4] + "-" + in[4:6] + "-" + in[6:11] + ":" + in[11:13] + ":" + in[13:15] + "+00:00"
 	}
 	t, err := time.Parse(time.RFC3339Nano, in)
-	if err == nil {
-		return t.UTC().Format(RFC3339NanoNoZ)
+	if err != nil {
+		return "", err
 	}
-	panic(err)
+	return t.UTC().Format(RFC3339NanoNoZ), nil
 }
 
 // ParseNormalizedDateString parses a time in the format returned by
@@ -430,7 +430,7 @@
 // sensible order; this deals with that, including overlaps (depend on flag, either replaces old with
 // younger or combines, REPLACE IS PREFERRED and works properly with combining old summary data with
 // fresh benchmarking data) and possibly also with previously processed summaries.
-func (b *Builder) AllComparisonSeries(existing []*ComparisonSeries, dupeHow int) []*ComparisonSeries {
+func (b *Builder) AllComparisonSeries(existing []*ComparisonSeries, dupeHow int) ([]*ComparisonSeries, error) {
 	old := make(map[string]*ComparisonSeries)
 	for _, cs := range existing {
 		old[cs.Unit] = cs
@@ -484,13 +484,19 @@
 		for tk, tr := range t.cells {
 			// tk == bench, experiment, tr == baseline, tests, tests == map hash -> cell.
 			bench := tk.Benchmark
-			dateString := NormalizeDateString(tk.Experiment.StringValues())
+			dateString, err := NormalizeDateString(tk.Experiment.StringValues())
+			if err != nil {
+				return nil, fmt.Errorf("error parsing experiment date %q: %w", tk.Experiment.StringValues(), err)
+			}
 			benchString := bench.StringValues()
 			benches[benchString] = struct{}{}
 			for hash, cell := range tr.tests {
 				hashString := hash.StringValues()
 				ser := b.hashToOrder[hash]
-				serString := NormalizeDateString(ser.StringValues())
+				serString, err := NormalizeDateString(ser.StringValues())
+				if err != nil {
+					return nil, fmt.Errorf("error parsing series date %q: %w", ser.StringValues(), err)
+				}
 				sers[serString] = struct{}{}
 				sk := SeriesKey{
 					Benchmark: benchString,
@@ -637,7 +643,7 @@
 		}
 	}
 
-	return css
+	return css, nil
 }
 
 func sortStringSet(m map[string]struct{}) []string {
diff --git a/cmd/benchseries/main.go b/cmd/benchseries/main.go
index 2337e50..dab8304 100644
--- a/cmd/benchseries/main.go
+++ b/cmd/benchseries/main.go
@@ -98,7 +98,10 @@
 	}
 
 	// Rearrange into comparisons (not yet doing the statistical work)
-	comparisons = seriesBuilder.AllComparisonSeries(comparisons, benchseries.DUPE_REPLACE)
+	comparisons, err = seriesBuilder.AllComparisonSeries(comparisons, benchseries.DUPE_REPLACE)
+	if err != nil {
+		fail("Error building comparison series: %v", err)
+	}
 
 	// Chat about residues, per-table
 	for _, t := range comparisons {
diff --git a/cmd/benchseries/main_test.go b/cmd/benchseries/main_test.go
index 0319404..d390108 100644
--- a/cmd/benchseries/main_test.go
+++ b/cmd/benchseries/main_test.go
@@ -138,7 +138,10 @@
 		f.Close()
 	}
 
-	comparisons = builder.AllComparisonSeries(comparisons, benchseries.DUPE_REPLACE)
+	comparisons, err = builder.AllComparisonSeries(comparisons, benchseries.DUPE_REPLACE)
+	if err != nil {
+		t.Fatalf("AllComparisonSeries(%+v) got err %v want nil", comparisons, err)
+	}
 
 	for _, c := range comparisons {
 		c.AddSummaries(0.95, 500) // 500 is faster than 1000.
