Note
Go to the end to download the full example code.
Airnow Data#
This example shows the different ways to pull air quality information from EPA’s AirNow API for a station near to SGP

<xarray.Dataset> Size: 0B
Dimensions: (index: 0)
Coordinates:
* index (index) int64 0B
Data variables:
DateIssue (index) object 0B
DateForecast (index) object 0B
ReportingArea (index) object 0B
StateCode (index) object 0B
Latitude (index) object 0B
Longitude (index) object 0B
ParameterName (index) object 0B
AQI (index) object 0B
CategoryNumber (index) object 0B
CategoryName (index) object 0B
ActionDay (index) object 0B
Discussion (index) object 0B
<xarray.Dataset> Size: 0B
Dimensions: (index: 0)
Coordinates:
* index (index) int64 0B
Data variables:
DateObserved (index) object 0B
HourObserved (index) object 0B
LocalTimeZone (index) object 0B
ReportingArea (index) object 0B
StateCode (index) object 0B
Latitude (index) object 0B
Longitude (index) object 0B
ParameterName (index) object 0B
AQI (index) object 0B
CategoryNumber (index) object 0B
CategoryName (index) object 0B
<xarray.Dataset> Size: 584B
Dimensions: (time: 13)
Coordinates:
* time (time) datetime64[us] 104B 2022-05-01 ... 2022-05-01T1...
sites <U10 40B 'Ponca City'
Data variables:
latitude float64 8B 36.7
longitude float64 8B -97.08
aqs_id int64 8B 400710604
PM2.5 (time) float64 104B 4.3 5.3 5.9 6.9 ... 7.7 7.4 7.6 7.8
AQI (time) float64 104B 24.0 29.0 33.0 ... 41.0 42.0 43.0
category (time) float64 104B 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0
raw_concentration (time) float64 104B 5.1 6.3 6.5 7.9 ... 7.1 7.1 7.8 8.1
/home/runner/work/ACT/ACT/act/plotting/plot.py:81: UserWarning: Could not discern datastreamname and dict or tuple were not provided. Using defaultname of act_datastream!
warnings.warn(
import os
import matplotlib.pyplot as plt
import act
# You need an account and token from https://docs.airnowapi.org/ first
token = os.getenv('AIRNOW_API')
if token is not None and len(token) > 0:
# This first example will get the forcasted values for the date passed
# at stations within 100 miles of the Zipcode. Can also use latlon instead as
# results = act.discovery.get_airnow_forecast(token, '2022-05-01', distance=100,
# latlon=[41.958, -88.12])
# If the username and token are not set, use the existing sample file
results = act.discovery.get_airnow_forecast(token, '2022-05-01', zipcode=74630, distance=100)
# The results show a dataset with air quality information from Oklahoma City
# The data is not indexed by time and just a rudimentary xarray object from
# converted from a pandas DataFrame. Note that the AirNow API labels the data
# returned as AQI.
print(results)
# This call gives the daily average for Ozone, PM2.5 and PM10
results = act.discovery.get_airnow_obs(token, date='2022-05-01', zipcode=74630, distance=100)
print(results)
# This call will get all the station data for a time period within
# the bounding box provided. This will return the object with time
# as a coordinate and can be used with ACT Plotting to plot after
# squeezing the dimensions. It can be a 2D time series
lat_lon = '-98.172,35.879,-96.76,37.069'
results = act.discovery.get_airnow_bounded_obs(
token, '2022-05-01T00', '2022-05-01T12', lat_lon, 'OZONE,PM25', data_type='B'
)
# Reduce to 1D timeseries
results = results.squeeze(dim='sites', drop=False)
print(results)
# Plot out data but note that Ozone was not return in the results
display = act.plotting.TimeSeriesDisplay(results)
display.plot('PM2.5', label='PM2.5')
display.plot('AQI', label='AQI')
plt.legend()
plt.show()
Total running time of the script: (0 minutes 1.594 seconds)