diff --git a/geomagio/processing/obsrio.py b/geomagio/processing/obsrio.py
index e960fe23c874fff7b9475251ed94e77f7bdba809..7d29f1fd50a262f0432d6458fe5fb94366e753c0 100644
--- a/geomagio/processing/obsrio.py
+++ b/geomagio/processing/obsrio.py
@@ -134,6 +134,76 @@ def obsrio_tenhertz(
         )
 
 
+def obsrio_hour(
+    observatory: str,
+    input_factory: Optional[TimeseriesFactory] = None,
+    output_factory: Optional[TimeseriesFactory] = None,
+    realtime_interval: int = 600,
+    update_limit: int = 10,
+):
+    """Filter 1 second edge H,E,Z,F to 1 hour U,V,W,F."""
+    starttime, endtime = get_realtime_interval(realtime_interval)
+    # filter 10Hz U,V,W to H,E,Z
+    controller = Controller(
+        algorithm=FilterAlgorithm(
+            input_sample_period=60.0, output_sample_period=3600.0
+        ),
+        inputFactory=input_factory or get_edge_factory(data_type="variation"),
+        inputInterval="minute",
+        outputFactory=output_factory or get_miniseed_factory(data_type="variation"),
+        outputInterval="hour",
+    )
+    renames = {"H": "U", "E": "V", "Z": "W", "F": "F"}
+    for input_channel in renames.keys():
+        output_channel = renames[input_channel]
+        controller.run_as_update(
+            observatory=(observatory,),
+            output_observatory=(observatory,),
+            starttime=starttime,
+            endtime=endtime,
+            input_channels=(input_channel,),
+            output_channels=(output_channel,),
+            realtime=realtime_interval,
+            rename_output_channel=((input_channel, output_channel),),
+            update_limit=update_limit,
+        )
+
+
+def obsrio_day(
+    observatory: str,
+    input_factory: Optional[TimeseriesFactory] = None,
+    output_factory: Optional[TimeseriesFactory] = None,
+    realtime_interval: int = 86400,
+    update_limit: int = 7,
+):
+    """Filter 1 second edge H,E,Z,F to 1 day U,V,W,F."""
+    starttime, endtime = get_realtime_interval(realtime_interval)
+    # filter 10Hz U,V,W to H,E,Z
+    controller = Controller(
+        algorithm=FilterAlgorithm(
+            input_sample_period=60.0, output_sample_period=86400.0
+        ),
+        inputFactory=input_factory or get_edge_factory(data_type="variation"),
+        inputInterval="minute",
+        outputFactory=output_factory or get_miniseed_factory(data_type="variation"),
+        outputInterval="day",
+    )
+    renames = {"H": "U", "E": "V", "Z": "W", "F": "F"}
+    for input_channel in renames.keys():
+        output_channel = renames[input_channel]
+        controller.run_as_update(
+            observatory=(observatory,),
+            output_observatory=(observatory,),
+            starttime=starttime,
+            endtime=endtime,
+            input_channels=(input_channel,),
+            output_channels=(output_channel,),
+            realtime=realtime_interval,
+            rename_output_channel=((input_channel, output_channel),),
+            update_limit=update_limit,
+        )
+
+
 def filter_realtime(
     observatory: str,
     input_factory: Optional[TimeseriesFactory] = None,