GitHub
Release DOI

FSA Normal Grazing Period Archive

This repository is an archive of the annual county-level Normal Grazing Period (NGP) data for the USDA Livestock Forage Disaster Program (LFP). Normal Grazing Periods define the historical timeframe during which forage is typically available for livestock grazing under non-drought conditions. These periods are used by the USDA Farm Service Agency (FSA) to determine eligibility and payment amounts for forage and crop loss due to drought.

For more information on the role of NGPs in the LFP, refer to FSA Handbook 1-LFP, Amendment 4.

The data in this repository were acquired via FOIA requests 2025-FSA-04691-F, 2026-FSA-02435-F, and 2026-FSA-03465-F by R. Kyle Bocinsky (Montana Climate Office). All three requests and their responses are archived in the foia directory.

The published archive is built from two of them: 2025-FSA-04691-F (program years 2008–2025) and 2026-FSA-03465-F (2025–2026). 2026-FSA-02435-F is retained for provenance but is not read by the processing script — it covers 2008–2025 and contributes no county, program year, or pasture type the other two lack.

🗂️ Contents

☁️ Archive Hosting & Automated Publishing

The consolidated data (fsa-normal-grazing-period.csv and fsa-normal-grazing-period.parquet), the QA report (qa-report.txt), the assets/ directory the dashboard reads from, and the foia/ correspondence are all mirrored to S3, served via CloudFront at https://data.sustainable-fsa.com/fsa-normal-grazing-period/ (browse the archive listing or _manifest.txt for a flat index). The interactive dashboard itself is served separately, via GitHub Pages at https://sustainable-fsa.com/fsa-normal-grazing-period/.

Publishing is handled by fsa-normal-grazing-period.R via the shared R/s3-archive.R helpers, and runs automatically in GitHub Actions (.github/workflows/fsa-normal-grazing-period.yaml) whenever the script, dashboard, or workflow changes, or on manual dispatch. The workflow authenticates to AWS via GitHub OIDC (no long-lived credentials stored in the repo), re-renders the README and dashboard, and commits them back to git only if the rendered output changed.


📥 Input Data: FOIA Excel Workbook

The FOIA responses contain annual NGP data from 2008 through 2026 for each pasture type, county, and program year.

Key Variables

Variable Name Description
Program Year Year the data applies to
State Name U.S. state
County Name County or county-equivalent name
State FSA Code FSA-assigned state code (not always ANSI/FIPS)
County FSA Code FSA-assigned county code (not always ANSI/FIPS)
Pasture Grazing Type Pasture classification (e.g., Native, Improved)
Normal Grazing Period Start Date Start date of typical grazing period
Normal Grazing Period End Date End date of typical grazing period

The columns above are those of the 2025-FSA-04691-F workbook. The 2026-FSA-03465-F workbook carries the same eight fields in the same order but names them in snake_case (program_year, state_fsa_code, …, and pasture_grazing_type_description), and reports FSA codes without zero padding. The processing script pads those codes and aligns the names positionally.

Roughly 33,000 rows across the two workbooks have no start or end date; these are dropped. No row has one date without the other.


🧹 Processing Workflow

The processing script fsa-normal-grazing-period.R:

  1. Unzips and reads the FOIA Excel workbooks.
  2. Filters records with missing dates.
  3. Cleans and standardizes pasture type names.
  4. Canonicalizes FSA county names where FSA reports one county under more than one name, so the record key stays unique. Missouri 29510 is the only current instance, appearing as both St. Louis and St. Louis, St. Louis City.
  5. Corrects known errors in the FOIA source data. Each correction is scoped to the specific county, program year, and pasture type it applies to:
    • Native Pasture in Piute and Sevier counties, UT (2010) — start date reported one year early (2009 rather than 2010).
    • Three South Dakota counties (2026) — start year reported as 2006.
    • Mississippi Annual Ryegrass (2013) — period reported one year early.
    • Six West Virginia counties (2026) — end year reported as 2027, describing a 19-month grazing period. Only the year is corrected; the reported month and day stand.
  6. De-duplicates, removing 371 rows that are exact repeats of another by this point: 7 were already identical in the source, 334 became identical once the two spellings of Full Season Improved Mixed Pasture were standardized in step 3, and 30 once the county-name variants were canonicalized in step 4. No record differing in its dates is ever merged with another.
  7. Validates the result (see below) and writes a QA report.
  8. Exports fsa-normal-grazing-period.csv.
  9. Renders an interactive Quarto dashboard.

There is no aggregation step. The archive is keyed on the FSA county and preserves every record FSA reports; see Relating FSA counties to Census counties below for how to relate it to Census geography.

✅ Validation

The script enforces four invariants and aborts before writing anything if any of them fails, so a defect cannot reach the published archive:

  • exactly one record per program year, FSA county, and pasture type;
  • every grazing period ends on or after it starts;
  • no missing values in any published field;
  • every FSA county resolves against FSA’s published county definitions.

A further set of conditions is reported rather than treated as fatal, since a new FOIA release may legitimately introduce one. These are written to qa-report.txt, published alongside the data:

  • dates falling outside the program year ± 1 window;
  • zero-length grazing periods;
  • grazing periods longer than 366 days;
  • county-years absent between two reporting years;
  • FSA counties reported under more than one name.

📤 Output Data

fsa-normal-grazing-period.csv and .parquet

The archive of record, published in both formats with identical records. The Parquet carries column types; in the CSV the zero-padded FSA codes 01 and 001 must be read as character or they become 1.

One row per program year, FSA county, and pasture type — the grain FSA itself reports at. Uniquely keyed by Program Year, State FSA Code, County FSA Code, and Pasture Type.

Variable Name Type Description
Program Year integer LFP program year the record applies to (2008–2026)
State FSA Code character Two-digit zero-padded FSA state code (e.g. 01)
County FSA Code character Three-digit zero-padded FSA county code (e.g. 001)
FSA State Name character State or territory name, as reported by FSA
FSA County Name character FSA county (service area) name, as reported by FSA
Pasture Type character Standardized pasture or forage classification
Grazing Period Start Date date Start of the normal grazing period (YYYY-MM-DD)
Grazing Period End Date date End of the normal grazing period (YYYY-MM-DD)

Pasture Type takes 16 distinct values across the archive.

Three things to know before using the data:

  • A grazing period may begin in the calendar year preceding its program year — winter forage types such as Long Season Small Grains routinely do — so Grazing Period Start Date should never be assumed to fall within Program Year.
  • FSA codes are not FIPS codes. They coincide for most counties, but 20 of the 3,095 FSA counties here carry a code matching no FIPS county they cover, so resolve them through the FSA county definitions rather than treating one as the other. See Relating FSA counties to Census counties below.
  • A county absent from a program year is not necessarily an error. FSA did not publish a grazing period for every county in every year; 15 county-years are missing inside a county’s own span of reporting, and are listed in qa-report.txt.

🗺️ Relating FSA counties to Census counties

The archive is keyed on the FSA county. If you need Census (FIPS) geography, take the mapping from the FSA administrative boundary archives, which are the authority on it:

🔗 fsa-counties-dd17 · 🔗 fsa-counties-dd22

Their geoparquets carry one row per FSA-to-FIPS pair, so reading FSA_ST, FSA_STCOU, FIPSST, and FIPSCO gives you the crosswalk directly. Three things to know before joining.

The relation is many-to-many in both directions. One FSA county may cover several FIPS counties — 38 do in dd22. FSA runs four offices for all of Alaska, so FSA 02005 (Palmer) alone spans 14 census areas, and Puerto Rico’s 72025 (Caguas) spans 23 municipios. Joining replicates such a record across every FIPS county it covers, the same reported grazing period appearing in all 23.

Several FSA counties may fall inside one FIPS county, because FSA splits some counties administratively and each half sets its own grazing period. Nine do under dd22, twelve under dd17:

FIPS county FSA counties (dd22)
Aroostook, ME (23003) Aroostook · Fort Kent · Houlton
Custer, ID (16037) Lemhi, North Custer · South Custer
Pottawattamie, IA (19155) East Pottawattamie · West Pottawattamie
Otter Tail, MN (27111) East Otter Tail · West Otter Tail
Polk, MN (27119) East Polk · West Polk
St. Louis, MN (27137) North St. Louis · South St. Louis
Nye, NV (32023) Northwest Nye · Southeast Nye
Lucas, OH (39095) East Lucas · West Lucas
Galax, VA (51640) Carroll, East Galax City · Grayson, West Galax City

Under dd17 the list also includes Shoshone, ID (16079), Sioux, NE (31165), and King, WA (53033) — the three counties FSA has since given their own offices.

These halves often disagree. In Lucas County, OH, Forage Sorghum runs 04-1510-30 in East Lucas but 05-0107-31 in West Lucas — 198 days against 91. A join on FIPS therefore returns several records per county per pasture type. The archive reduces neither: the union of the two reports 198 days for both, and the intersection reports the interval they agree on.

The mapping depends on the program year. FSA reorganised several counties between the two vintages, and six codes map to a different set of FIPS counties in each — for example 16009 covers Benewah and Shoshone in dd17 but Benewah alone in dd22, once Shoshone became 16079. Choose the vintage that matches the program year you are working with: dd17 for 2008–2014, dd22 for 2015 onward.

library(dplyr)
library(arrow)
library(readr)

ngp <- read_csv("https://data.sustainable-fsa.com/fsa-normal-grazing-period/fsa-normal-grazing-period.csv")

# The crosswalk, from the boundary archive matching your program years. Only the
# code columns are read, so the geometry is not transferred.
xwalk <-
  read_parquet(
    "https://data.sustainable-fsa.com/fsa-counties-dd22/fsa-counties-dd22.parquet",
    col_select = c("FSA_ST", "FSA_STCOU", "FIPSST", "FIPSCO")
  ) |>
  transmute(
    `State FSA Code` = FSA_ST,
    `County FSA Code` = substr(FSA_STCOU, 3, 5),
    FIPS = paste0(FIPSST, FIPSCO)
  ) |>
  distinct()

# `relationship` is explicit because the join genuinely is many-to-many;
# leaving it implicit hides the fan-out.
ngp_fips <-
  ngp |>
  filter(`Program Year` >= 2015) |>
  inner_join(xwalk,
             by = c("State FSA Code", "County FSA Code"),
             relationship = "many-to-many")

📊 Demonstration Dashboard

The Quarto dashboard fsa-normal-grazing-period.qmd provides:

  • An interactive viewer to explore NGPs by county, year, and pasture type
  • Visual summaries of seasonality and regional variation
  • A tool for researchers and policymakers to assess temporal trends

The map draws FSA counties, so it shows the archive without reduction — administratively split counties such as East and West Lucas, OH appear as the separate polygons FSA reports them as.

County boundaries are fetched at run time from the FSA administrative boundary archives, and the vintage follows the program year: fsa-counties-dd17 for 2008–2014 and fsa-counties-dd22 for 2015 onward. FSA reorganised several counties between the two vintages — most visibly Shoshone County, ID, which was split out of the Benewah and Kootenai offices — so each year is drawn on the boundaries that were in force for it. Drawing an early year on current boundaries would leave the territory of a since-split county blank even though its grazing period was reported, under the office that then administered it.

A county with no colour means one of two things:

  • No polygon. The island territories are not drawn; neither boundary archive includes them. Their grazing periods are still in the data.
  • No reported grazing period for that county and year. Ten FSA counties have a year missing inside their reporting span, 15 county-years in all — mostly 2009–2011, plus Shoshone County, ID in 2016. Every one is listed in qa-report.txt.

Access a full-screen version of the dashboard at:
https://sustainable-fsa.com/fsa-normal-grazing-period/fsa-normal-grazing-period.html


📍 Quick Start: Visualize a Normal Grazing Period Map in R

This snippet maps the archive using sf and ggplot2. It reads the data file this build just produced; substitute the published URL from Contents to run it yourself.

The map draws FSA counties, which is the unit the archive is keyed on, so no crosswalk and no reduction are needed. Boundaries come from the FSA administrative boundary archives.

# Load required libraries
library(sf)
library(ggplot2) # For plotting
library(rmapshaper) # For innerlines function

## Get the Normal Grazing Period data
ngp <- readr::read_csv("fsa-normal-grazing-period.csv")

## FSA county boundaries, already simplified and with Alaska and Hawaii inset
counties <-
  sf::read_sf(
    "/vsicurl/https://data.sustainable-fsa.com/fsa-counties-dd22/fsa-counties-dd22.topojson",
    layer = "counties"
  ) |>
  sf::st_set_crs("EPSG:4326") |>
  sf::st_transform("EPSG:5070")

## Calculate the 2026 Normal Grazing Period duration for Native Pasture, and
## combine with the county data
ngp_counties <-
  ngp |>
  dplyr::filter(`Pasture Type` == "Native Pasture",
                `Program Year` == 2026) |>
  dplyr::transmute(
    id = paste0(`State FSA Code`, `County FSA Code`),
    `Grazing Period Duration` =

        (`Grazing Period End Date` - `Grazing Period Start Date`) |>
      magrittr::divide_by(7) |>
      as.integer()
  ) |>
  dplyr::left_join(counties) |>
  sf::st_as_sf()

# Plot the map
ggplot(counties) +
  geom_sf(data = sf::st_union(counties),
          fill = "grey80",
          color = NA) +
  geom_sf(data = ngp_counties,
          aes(fill = `Grazing Period Duration`), 
          color = NA) +
  geom_sf(data = rmapshaper::ms_innerlines(counties),
          fill = NA,
          color = "white",
          linewidth = 0.1) +
  geom_sf(data = counties |>
            dplyr::group_by(state) |>
            dplyr::summarise() |>
            rmapshaper::ms_innerlines(),
          fill = NA,
          color = "white",
          linewidth = 0.2) +
  khroma::scale_fill_batlowK(limits = c(0,52),
                            name = "NGP\nDuration\n(weeks)") +
  labs(title = "FSA Normal Grazing Period Duration",
       subtitle = "Native Pasture — 2026") +
  theme_void()


🧭 About FSA County Codes

The USDA FSA uses custom county definitions that differ from the standard ANSI/FIPS codes used by the U.S. Census. FSA administers some Census counties as two or three separate service areas, and elsewhere administers many Census counties from a single one — so an FSA county is not a Census county, even where the two share a code. This archive is keyed on the FSA county because that is the unit FSA reports Normal Grazing Periods for.

The authoritative FSA county definitions, including the FIPS crosswalk, are archived in the companion repositories:

🔗 sustainable-fsa/fsa-counties-dd17 — FSA county definitions, dd17 vintage 🔗 sustainable-fsa/fsa-counties-dd22 — FSA county definitions, dd22 vintage

This archive publishes no crosswalk of its own. See Relating FSA counties to Census counties above for how to take the mapping from those archives, and why the vintage you choose depends on the program year.

FSA county codes are documented in FSA Handbook 1-CM, Exhibit 101.


📝 Citation

If you use this data in published work, please cite:

USDA Farm Service Agency. Normal Grazing Periods, 2008–2026. Obtained under FOIA requests 2025-FSA-04691-F, 2026-FSA-02435-F, and 2026-FSA-03465-F; curated and archived by R. Kyle Bocinsky, Montana Climate Office, University of Montana. Sustainable FSA project. Accessed YYYY-MM-DD. https://sustainable-fsa.com/fsa-normal-grazing-period/

DOI: https://doi.org/10.5281/zenodo.15252842

Machine-readable metadata are in CITATION.cff; GitHub’s Cite this repository button (top right of the repo page) renders it as APA or BibTeX.

Acknowledgment: This work is part of the Enhancing Sustainable Disaster Relief in FSA Programs project, supported by the USDA Office of the Chief Economist, Office of Energy and Environmental Policy, and the USDA Climate Hubs.

📄 License

  • Raw FOIA data (USDA): Public Domain (17 USC § 105)
  • Processed data & scripts: © R. Kyle Bocinsky, released under CC0 and MIT License as applicable

⚠️ Disclaimer

This dataset is archived for research and educational use only. It may not reflect current USDA administrative boundaries or official LFP policy. Always consult your local FSA office for the latest program guidance.

To locate your nearest USDA Farm Service Agency office, use the USDA Service Center Locator:

🔗 USDA Service Center Locator


👏 Acknowledgment

This project is part of:

Enhancing Sustainable Disaster Relief in FSA Programs
Supported by USDA OCE/OEEP and USDA Climate Hubs
Prepared by the Montana Climate Office


✉️ Contact

Questions? Contact Kyle Bocinsky: kyle.bocinsky@umontana.edu