diff --git a/scripts/viirs_pkt_size.py b/scripts/viirs_pkt_size.py
new file mode 100755
index 0000000000000000000000000000000000000000..80251d18077002e9aafd2be777ee6eaf25fefcea
--- /dev/null
+++ b/scripts/viirs_pkt_size.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+import numpy as np
+import netCDF4
+from edosl0util import jpssrdr
+from edosl0util.headers import GROUP_CONTINUING, GROUP_LAST
+
+
+def write_netcdf_file(destpath, scans, sizes):
+    dataset = netCDF4.Dataset(destpath, 'w')
+    dataset.createDimension('scan', size=len(scans))
+    dataset.createDimension('apid', size=len(sizes))
+    dataset.createVariable('time', 'u8', ('scan',))
+    dataset.createVariable('size', 'u8', ('apid', 'scan',))
+    dataset.createVariable('apid', 'u2', ('apid',))
+
+    dataset['time'][:] = np.array(list(scans))
+    apids = sorted(sizes.keys())
+    # assert len(apids) == 16, "Expected 16 apids, got {}".format(apids)
+    dat = np.array([sizes[a] for a in apids])
+    dataset['size'][:] = dat
+    dataset['apid'][:] = np.array(apids)
+    dataset.close()
+
+
+def read_data_from_rdr(filepath):
+    # XXX: just get the VIIRS Science RDR for now
+    rdr = jpssrdr.rdr_datasets(filepath)['science'][0]
+    scans = set()
+    sizes = {}
+    for tracker, packet in rdr.packets():
+        apid = packet.apid
+        scan = tracker.obs_time
+        size = tracker.size
+
+        if apid not in sizes:
+            sizes[apid] = []
+
+        # Sum up sizes for packet groups
+        if packet.sequence_grouping in (GROUP_CONTINUING, GROUP_LAST):
+            sizes[apid][-1] += size
+        else:
+            sizes[apid].append(size)
+
+        scans.add(scan)
+
+    return scans, sizes
+
+
+if __name__ == '__main__':
+    import argparse
+    parser = argparse.ArgumentParser()
+    parser.add_argument('viirs_rdr')
+    args = parser.parse_args()
+    destpath = args.viirs_rdr + '.size.nc'
+    scans, sizes = read_data_from_rdr(args.viirs_rdr)
+    write_netcdf_file(destpath, scans, sizes)