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
foia/2025-FSA-04691-F Bocinsky.zip— FOIA 2025-FSA-04691-F data and correspondencefoia/2026-FSA-02435-F Bocinsky.zip— FOIA 2026-FSA-02435-F data and correspondencefoia/2026-FSA-03465-F Bocinsky.zip— FOIA 2026-FSA-03465-F data and correspondencefsa-normal-grazing-period.csv— cleaned and consolidated data, one record per program year, FSA county, and pasture typefsa-normal-grazing-period.parquet— the same records as Parquetqa-report.txt— validation summary and flagged records for the published datafsa-normal-grazing-period.R— processing scriptfsa-normal-grazing-period.qmd— Quarto dashboard sourcefsa-normal-grazing-period.html— interactive summary dashboard_manifest.txt— flat index of every file in the S3-hosted mirror
☁️ 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:
- Unzips and reads the FOIA Excel workbooks.
- Filters records with missing dates.
- Cleans and standardizes pasture type names.
- 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. LouisandSt. Louis, St. Louis City. - 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.
- 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.
- Validates the result (see below) and writes a QA report.
- Exports
fsa-normal-grazing-period.csv. - 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 Dateshould never be assumed to fall withinProgram 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-15 → 10-30 in East Lucas but 05-01 → 07-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/
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:
👏 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
