air-monitor-algorithms
Algorithms for processing hourly time series data, with an initial focus on air quality monitoring applications.
This package supports the air-monitor ecosystem, which works with air quality monitoring data archives hosted by the US Forest Service.
Note: All time series data are assumed to be on a regular hourly axis with no gaps. Missing values should be represented as
null.🚨 Important: All timestamp inputs must be Luxon
DateTimeobjects in the UTC timezone. All timestamp outputs are also returned asDateTimeobjects in UTC.
Features
High-level analysis functions:
-
dailyStats(datetime, x, timezone)Returns local-time daily statistics (min, max, mean, count) from hourly data. -
diurnalStats(datetime, x, timezone, dayCount)Returns local-time hourly averages from the most recentdayCountdays. -
pm_nowcast(pm)Calculates EPA-style NowCast values from hourly PM2.5 or PM10 data. -
trimDate(datetime, x, timezone)Trims input to full local-time days (midnight to midnight).
Array utility functions:
arrayCount(x)— Count of non-missing (!= null) valuesarraySum(x)— Sum of valid valuesarrayMin(x)— Minimum valid valuearrayMean(x)— Mean of valid valuesarrayMax(x)— Maximum valid value
Installation
To install the latest stable release from npm:
npm install air-monitor-algorithms
To install the latest development version directly from GitHub:
npm install github:MazamaScience/air-monitor-algorithms
Usage
This ES module can be used in modern JavaScript projects, including Svelte
and Vue apps. You must use Luxon DateTime objects in UTC as input timestamps.
import {
dailyStats,
pm_nowcast
} from "air-monitor-algorithms";
import { DateTime } from "luxon";
// Generate fake hourly data for 3 days
const datetime = [];
const x = [];
const start = DateTime.fromISO("2023-07-01T00:00:00Z"); // UTC
for (let i = 0; i < 72; i++) {
datetime.push(start.plus({ hours: i })); // UTC Luxon DateTime
x.push(50 + Math.sin(i / 3) * 10); // sinusoidal variation
}
// Calculate daily statistics in the 'America/Los_Angeles' timezone
const daily = dailyStats(datetime, x, "America/Los_Angeles");
console.log(daily.mean); // → [meanDay1, meanDay2, meanDay3]
// Apply NowCast to the hourly data
const nowcast = pm_nowcast(x);
console.log(nowcast.slice(-5)); // → last 5 hourly NowCast values
Related Packages
License
GPL-3.0-or-later © 2024–2025 Jonathan Callahan / USFS AirFire