diff --git a/geomagio/adjusted/Affine.py b/geomagio/adjusted/Affine.py
index 1acc421717c4a436edc11c3a48df43fb39336899..54820455a8bd41a9390e1db07e26f99835617116 100644
--- a/geomagio/adjusted/Affine.py
+++ b/geomagio/adjusted/Affine.py
@@ -267,7 +267,6 @@ class Affine(BaseModel):
         times = self.get_times(readings)
         Ms = []
         weights = []
-        metrics = []
         inputs = ordinates
 
         for transform in self.transforms:
@@ -278,7 +277,10 @@ class Affine(BaseModel):
             )
             # return NaNs if no valid observations
             if np.sum(weights) == 0:
-                raise ValueError(f"No valid observations for {time}")
+                return AdjustedMatrix(
+                    matrix=np.nan * np.ones((4, 4)),
+                    pier_correction=np.nan,
+                )
             # zero out statistically 'bad' baselines
             weights = self.weight_baselines(baselines=baselines, weights=weights)
 
diff --git a/test/adjusted_test/adjusted_test.py b/test/adjusted_test/adjusted_test.py
index 26047ccccb1d6479dd50e7f2d841827a5f8e63bb..adcd74112dcf2f80618f7b0aeaaedc72e91dc23c 100644
--- a/test/adjusted_test/adjusted_test.py
+++ b/test/adjusted_test/adjusted_test.py
@@ -1,6 +1,6 @@
 import json
 import numpy as np
-from numpy.testing import assert_equal, assert_array_almost_equal, assert_array_less
+from numpy.testing import assert_equal, assert_array_almost_equal, assert_array_equal
 from obspy.core import UTCDateTime
 
 from geomagio.adjusted.SpreadsheetSummaryFactory import SpreadsheetSummaryFactory
@@ -235,7 +235,6 @@ def test_BOU201911202001_short_causal():
     ).calculate(readings=readings)
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "short_causal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -266,7 +265,6 @@ def test_BOU201911202001_short_acausal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "short_acausal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -301,7 +299,6 @@ def test_BOU201911202001_infinite_weekly():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "inf_weekly")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -330,7 +327,6 @@ def test_BOU201911202001_infinite_one_interval():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "inf_one_interval")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -342,6 +338,23 @@ def test_BOU201911202001_infinite_one_interval():
     assert_equal(len(matrices), 1)
 
 
+def test_BOU201911202001_invalid_readings():
+    readings = []
+    result = Affine(
+        observatory="BOU",
+        starttime=UTCDateTime("2019-11-01T00:00:00Z"),
+        endtime=UTCDateTime("2020-01-31T23:59:00Z"),
+        acausal=True,
+        transforms=[
+            RotationTranslationXY(memory=np.inf),
+            TranslateOrigins(memory=np.inf),
+        ],
+        update_interval=None,
+    ).calculate(readings=readings,)[0]
+    assert_array_equal(result.matrix, np.nan * np.ones((4, 4)))
+    assert_equal(result.pier_correction, np.nan)
+
+
 def test_CMO2015_causal():
     readings = get_spreadsheet_directory_readings(
         observatory="CMO",
@@ -366,7 +379,6 @@ def test_CMO2015_causal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "short_causal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -403,7 +415,6 @@ def test_CMO2015_acausal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "short_acausal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -444,7 +455,6 @@ def test_CMO2015_infinite_weekly():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "inf_weekly")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -481,7 +491,6 @@ def test_CMO2015_infinite_one_interval():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "inf_one_interval")
     for i in range(len(matrices)):
         assert_array_almost_equal(