

Installable with pip and conda (conda-forge)
Why use it?
xarray and dask
DatasetIDfrom satpy import Scene, DatasetID
from glob import glob
scn = Scene(reader='abi_l1b', filenames=glob('/data/data/abi/20170920/*.nc'))
scn.load(['C01', 'C02'])
scn.load([0.46, 0.62])
ds_id = DatasetID(name='C02', calibration='radiance')
scn.load([ds_id])
scn['C02']
<xarray.DataArray (y: 21696, x: 21696)>
dask.array<shape=(21696, 21696), dtype=float64, chunksize=(4096, 4096)>
Coordinates:
* x (x) float64 -0.1519 -0.1519 -0.1518 -0.1518 -0.1518 -0.1518 ...
y_image float32 0.0
x_image float32 0.0
* y (y) float64 0.1519 0.1519 0.1518 0.1518 0.1518 0.1518 0.1518 ...
Attributes:
satellite_longitude: -89.5
satellite_latitude: 0.0
satellite_altitude: 35786.0234375
units: %
modifiers: ()
wavelength: (0.59, 0.64, 0.69)
grid_mapping: goes_imager_projection
_Unsigned: true
cell_methods: t: point area: point
standard_name: toa_bidirectional_reflectance
scale_factor: 0.158592
ancillary_variables: []
valid_range: [ 0 4094]
long_name: ABI L1b Radiances
add_offset: -20.2899
resolution: 500
calibration: reflectance
_FillValue: 4095
sensor: abi
sensor_band_bit_depth: 12
name: C02
platform_name: GOES-16
start_time: 2017-09-20 17:30:40.800000
end_time: 2017-09-20 17:41:17.500000
area: Area ID: abi_geos\nDescription: ABI L1B file area...
polarization: None
level: None
scn.show('C01')


scn.load(['airmass'])
scn['airmass']
<xarray.DataArray 'concatenate-d3ffb434ba4f6164ba94e209a0860c74' (bands: 3, y: 5424, x: 5424)>
dask.array<shape=(3, 5424, 5424), dtype=float64, chunksize=(1, 4096, 4096)>
Coordinates:
* x (x) float64 -0.1518 -0.1518 -0.1517 -0.1517 -0.1516 -0.1516 ...
y_image float32 0.0
x_image float32 0.0
* y (y) float64 0.1518 0.1518 0.1517 0.1517 0.1516 0.1516 0.1515 ...
* bands (bands) <U1 'R' 'G' 'B'
Attributes:
long_name: ABI L1b Radiances
grid_mapping: goes_imager_projection
level: None
satellite_latitude: 0.0
sensor: abi
satellite_altitude: 35786.0234375
ancillary_variables: []
start_time: 2017-09-20 17:30:40.800000
cell_methods: t: point area: point
polarization: None
resolution: None
area: Area ID: some_area_name\nDescription: On-the-fly...
platform_name: GOES-16
_Unsigned: true
satellite_longitude: -89.5
standard_name: airmass
wavelength: None
optional_datasets: []
end_time: 2017-09-20 17:41:18.600000
name: airmass
prerequisites: [6.2, 7.3, 9.7, 10.3]
optional_prerequisites: []
calibration: None
modifiers: None
mode: RGB

scn.load(['true_color'])
Operations Involved:
from satpy import Scene
from glob import glob
scn = Scene(reader='viirs_sdr',
filenames=glob('/data/data/viirs/conus_day/*t1801*.h5'))
scn.load(['I04'])
scn.show('I04')

scn = Scene(reader='viirs_sdr',
filenames=glob('/data/data/viirs/conus_day/*t180*.h5'))
scn.load(['I04'])
new_scn = scn.resample('211e')
new_scn.show('I04')

scn.save_datasets(writer='geotiff', base_dir='/tmp', compress='LZW')
from satpy import Scene
scn = Scene(reader='abi_l1b', filenames=[...])
scn.load(['C01', 'C02', 'C08', 'true_color', 'air_mass', 'natural'])
new_scn = scn.resample(resampler='native')
new_scn.save_datasets(base_dir='/tmp')
from satpy import Scene, MultiScene
from glob import glob
import os
from dask.diagnostics import ProgressBar
base_dir = '/data/data/viirs/2018_06_29/'
viirs_passes = ['2018_06_29_180_0614', '2018_06_29_180_0752', '2018_06_29_180_0934']
viirs_scenes = [Scene(reader='viirs_sdr',
filenames=glob(os.path.join(base_dir, vp, '*.h5')))
for vp in viirs_passes]
mscn = MultiScene(viirs_scenes)
mscn.load(['I04'])
new_mscn = mscn.resample('211e')
blended_scn = new_mscn.blend()
with ProgressBar():
blended_scn.save_datasets()
[########################################] | 100% Completed | 4min 15.4s [########################################] | 100% Completed | 0.1s
! gdal_translate -of PNG -outsize 10% 10% I04_20180629_061415{.tif,.png}
Input file size is 5120, 5120 0...10...20...30...40...50...60...70...80...90...100 - done.

scenes = [Scene(reader='abi_l1b', filenames=step_files)
for step_files in grouped_files]
mscn = MultiScene(scenes)
mscn.load(['C01'])
new_mscn = mscn.resample(resampler='native')
new_mscn.save_animation('{name}_{start_time:%Y%m%d_%H%M%S}.mp4',
fps=5, batch_size=4,
output_params=["-vf", "format=yuv420p,scale=640:-1"])
from IPython.display import HTML
HTML("""
<video width="640" height="480" controls>
<source src="C01_20180623_000045.mp4" type="video/mp4">
</video>
""")
from satpy import Scene
from glob import glob
import matplotlib.pyplot as plt
filenames = glob('/data/data/viirs/conus_day/*t180*.h5')
scn = Scene(reader='viirs_sdr', filenames=filenames)
scn.load(['I04'])
new_scn = scn.resample('211e')
crs = new_scn['I04'].attrs['area'].to_cartopy_crs()
ax = plt.axes(projection=crs)
ax.coastlines()
ax.gridlines()
ax.set_global()
plt.imshow(new_scn['I04'], transform=crs, extent=crs.bounds, origin='upper')
cbar = plt.colorbar()
cbar.set_label("Kelvin")
plt.show()


from IPython.display import IFrame
IFrame('https://www.youtube.com/embed/eBQi2G_fqXQ?rel=0', width=600, height=400)