Portland Metro Crawlspace Climate and Housing Data
Rainfall, housing age and soil drainage for the Portland and Vancouver metro, assembled from NOAA, the US Census Bureau and the USDA and published as data rather than as marketing. It is descriptive context for why crawl space work in this region looks the way it does — not a prediction about any house, and not a score.
Read this before using the tables: there are two of them, and they must not be joined.
Precipitation is measured at a point. A NOAA normal describes one instrument, not the city around it. Two stations inside Portland city limits differ by 8.1 inches of annual normal precipitation. Across Vancouver, published stations within fifteen miles differ by 15.4 inches.
Housing age and soil are summarised over a city boundary. Those are Census places — legal and statistical lines that have nothing to do with where rain falls.
So the city table below carries a nearest station and the distance to it, and no rainfall figure. If you need a rainfall number for a city, take the station, take its distance, and take the spread — and say which station you used.
There is no crawl space risk score here, and there will not be one.
A score would imply a validated relationship between rainfall, soil, housing age and actual crawl space failure. No such model has been published for this metro. The weights would be invented, and the invented part is the part that would get quoted. Three defensible variables plus one invented weighting is not three-quarters defensible — it is a fabrication wearing the other three as credentials. This dataset also contains no crawl space failure, moisture or mould rates, because no such data exists for this region. The full list of what was considered and rejected is below, at the same weight as what was included.
What the data shows
Restrained readings only. Each of these is a restatement of what the numbers say, not an inference beyond them.
-
The wet season, not the annual total, is what a crawl space has to survive.
At every published station, between 72% and 77% of the annual precipitation normal falls between October and March. A drainage design sized against an annual average is sized against a number that never occurs.
-
Rainfall varies more inside this metro than the metro’s reputation suggests.
Published annual normals run from 35.93 inches at Hillsboro Airport to 52.37 inches at Battle Ground — a 46% difference across stations under 30 miles apart. Two stations inside Portland city limits differ by 7.15 inches.
-
Station choice can change a rainfall figure more than city choice does.
For several cities the spread among stations within fifteen miles exceeds the difference between city medians. That is why this dataset publishes rainfall per station and gives each city a station pointer instead of a rainfall value.
-
A city’s housing age says something about the code its homes were built under.
Median year built ranges from 1966 in Portland to 2006 in Happy Valley. Where more of the stock predates 1980, more of it was built under earlier expectations for ground cover, ventilation and insulation. It says nothing about the condition of any individual crawl space.
-
Soil drainage is the variable that differs most sharply across the metro.
The share of mapped area in the wetter drainage classes runs from 4.5% in Oregon City to 84.6% in Happy Valley. Where that share is high, water management is a design question rather than an optional upgrade — though what happens at one address still depends on that lot’s fill, grading and downspouts.
-
The soil survey is least informative exactly where the housing is oldest.
SSURGO assigns no drainage class to Urban land map units. In Portland that is 50.9% of the mapped area — the highest unrated share in the table, in the city with the oldest housing stock. Portland’s soil percentages should be read with that in mind, and they are published with the unrated share alongside them for that reason.
Table 1: precipitation stations
NOAA's 1991–2020 climate normals, one row per instrument. Annual precipitation across the metro runs from 35.93 inches at PORTLAND-HILLSBORO AP, OR to 52.37 inches at BATTLE GROUND, WA — a 46% difference between stations under thirty miles apart. Between 71.6% and 77.4% of it falls between October and March at every station here.
| Station | Elev. | Annual | Oct–Mar | Wet season share | Days ≥0.5″ | Days ≥1″ | NOAA flag |
|---|---|---|---|---|---|---|---|
| BATTLE GROUND, WA USC00450482 | 87 m | 52.37″ | 38.53″ | 73.6% | 34.1 | 7.7 | S 29 yrs |
| REX 1 S, OR USC00357127 | 157 m | 44.22″ | 33.9″ | 76.7% | 28.5 | 6.8 | S 26 yrs |
| PORTLAND KGW-TV, OR USC00356749 | 49 m | 44.07″ | 33.82″ | 76.7% | 28.5 | 6.4 | R 21 yrs |
| PORTLAND WFO, OR USC00356750 | 6 m | 43.74″ | 32.44″ | 74.2% | 26.4 | 5.3 | R 23 yrs |
| VANCOUVER 4 NNE, WA USC00458773 | 64 m | 42.27″ | 31.33″ | 74.1% | 24.1 | 5.6 | S 26 yrs |
| PORTLAND TROUTDALE AP, OR USW00024242 | 9 m | 40.66″ | 29.13″ | 71.6% | 22 | 4.1 | R 20 yrs |
| AURORA STATE AP, OR USW00094281 | 60 m | 39.55″ | 29.63″ | 74.9% | 22.5 | 4.3 | R 20 yrs |
| VANCOUVER PEARSON AP, WA USW00094298 | 9 m | 37.47″ | 28.05″ | 74.9% | 20.2 | 3.7 | R 20 yrs |
| PORTLAND INTL AP, OR USW00024229 | 6 m | 36.92″ | 27.32″ | 74% | 20.4 | 4.3 | S 30 yrs |
| PORTLAND-HILLSBORO AP, OR USW00094261 | 62 m | 35.93″ | 27.8″ | 77.4% | 17.9 | 3.7 | R 20 yrs |
NOAA completeness flags, republished unchanged: S standard,
R representative, C complete, P provisional,
E estimated. Four of these stations carry S with 26 to 30 years of
record; the rest carry R with 20 to 23. If your use needs only the strongest
stations, filter on this column — it is in the downloads for that reason.
Stations excluded, and the rule that excluded them
A station is published here only if NOAA's annual normal for it rests on at least 20 years of record. That rule drops stations sitting directly in cities this site serves, which is a real cost — but a four-year average presented as a thirty-year normal would be a worse one. What was dropped:
- WEST LINN 0.7 NW, OR US1ORCC0088 — 4 years of record,
NOAA flag
E - HILLSBORO 1.3 W, OR US1ORWS0081 — 3 years of record,
NOAA flag
E - HAPPY VALLEY 1.7 ESE, OR US1ORCC0066 — 6 years of record,
NOAA flag
E - CASCADE PARK EAST 0.2 ENE, WA US1WACK0004 — 6 years of record,
NOAA flag
E - TROUTDALE, OR USC00358634 — 11 years of record,
NOAA flag
E - NATURE PARK-BEAVERTON, OR USC00355945 — 11 years of record,
NOAA flag
R - OREGON CITY, OR USC00356334 — 13 years of record,
NOAA flag
E - N WILLAMETTE EXP STN, OR USC00356151 — 14 years of record,
NOAA flag
R - FOREST GROVE, OR USC00352997 — 18 years of record,
NOAA flag
R - PORTLAND 2.5 SE, OR US1ORMT0006 — 11 years of record,
NOAA flag
R
Table 2: cities
Housing age from the American Community Survey, soil drainage from the USDA soil survey clipped to each city boundary, and a pointer to the nearest published weather station. Ordered oldest housing stock first. There is no rainfall column here on purpose — see the note above.
| City | Housing units | Median year built | Built pre-1980 | Built pre-1960 | Built pre-1950 | Wetter soil classes | Soil unrated | Nearest station |
|---|---|---|---|---|---|---|---|---|
| Milwaukie, OR 4.99 sq mi | 9,876 | 1967 ±2 | 74.1% | 37.4% | 16.5% | 9.4% | 13.5% | PORTLAND KGW-TV, OR 6.1 mi · 5 within 15 mi spanning 7.15″ |
| Portland, OR 133.492 sq mi | 304,113 | 1966 ±2 | 64.3% | 45.3% | 34.3% | 25.1% | 50.9% | PORTLAND KGW-TV, OR 2.3 mi · 7 within 15 mi spanning 8.14″ |
| Gresham, OR 23.564 sq mi | 44,233 | 1981 ±1 | 48.1% | 10.9% | 4.2% | 54.5% | 3.1% | PORTLAND TROUTDALE AP, OR 3.7 mi · 5 within 15 mi spanning 7.15″ |
| Aloha, OR 7.298 sq mi | 19,437 | 1983 ±2 | 46.4% | 8.1% | 2.7% | 49.6% | 0% | PORTLAND-HILLSBORO AP, OR 5 mi · 5 within 15 mi spanning 8.29″ |
| Lake Oswego, OR 10.872 sq mi | 17,838 | 1982 ±1 | 45.7% | 12.7% | 6.1% | 38.9% | 7.9% | PORTLAND KGW-TV, OR 7.2 mi · 7 within 15 mi spanning 8.29″ |
| Oregon City, OR 10.051 sq mi | 14,473 | 1991 ±2 | 41.3% | 17.5% | 13% | 4.5% | 8.1% | AURORA STATE AP, OR 10.7 mi · 2 within 15 mi spanning 4.52″ |
| Vancouver, WA 48.802 sq mi | 83,450 | 1987 ±2 | 41% | 15.1% | 9.7% | 12.1% | 11.3% | VANCOUVER PEARSON AP, WA 3.1 mi · 7 within 15 mi spanning 15.45″ |
| Beaverton, OR 19.735 sq mi | 43,195 | 1987 ±2 | 37.7% | 7.3% | 4% | 52.7% | 1.9% | PORTLAND KGW-TV, OR 6.8 mi · 6 within 15 mi spanning 8.29″ |
| Tigard, OR 12.76 sq mi | 23,512 | 1988 ±2 | 35.5% | 6.2% | 2.7% | 41.6% | 3% | PORTLAND KGW-TV, OR 8 mi · 6 within 15 mi spanning 8.29″ |
| Washougal, WA 5.952 sq mi | 6,269 | 1997 ±3 | 33.8% | 17.9% | 11.7% | 14% | 15.2% | PORTLAND TROUTDALE AP, OR 3.7 mi · 3 within 15 mi spanning 6.82″ |
| West Linn, OR 7.43 sq mi | 10,482 | 1988 ±2 | 31.7% | 10.3% | 6.1% | 22.4% | 7.8% | AURORA STATE AP, OR 10.3 mi · 4 within 15 mi spanning 4.67″ |
| Tualatin, OR 8.418 sq mi | 11,357 | 1991 ±1 | 26.5% | 1.6% | 1% | 20.2% | 2.3% | REX 1 S, OR 8.4 mi · 4 within 15 mi spanning 8.29″ |
| Hillsboro, OR 26.443 sq mi | 42,595 | 1997 ±1 | 24.7% | 7.8% | 4.5% | 61.6% | 2.2% | PORTLAND-HILLSBORO AP, OR 1.1 mi · 3 within 15 mi spanning 8.14″ |
| Camas, WA 14.186 sq mi | 9,450 | 1999 ±2 | 23.8% | 18% | 14.3% | 11.7% | 17.8% | PORTLAND TROUTDALE AP, OR 3.7 mi · 7 within 15 mi spanning 15.45″ |
| Sherwood, OR 4.925 sq mi | 7,136 | 1997 ±1 | 18.4% | 4.5% | 2.9% | 27.7% | 2.3% | REX 1 S, OR 5.2 mi · 4 within 15 mi spanning 8.29″ |
| Battle Ground, WA 8.685 sq mi | 7,384 | 2002 ±1 | 17.8% | 3.9% | 3.1% | 22.7% | 0.1% | BATTLE GROUND, WA 0.7 mi · 5 within 15 mi spanning 15.45″ |
| Wilsonville, OR 7.69 sq mi | 10,772 | 1998 ±2 | 14.4% | 2.2% | 1.7% | 39.2% | 3.2% | AURORA STATE AP, OR 4.3 mi · 3 within 15 mi spanning 4.67″ |
| Happy Valley, OR 11.905 sq mi | 9,076 | 2006 ±2 | 13.7% | 3.6% | 1.2% | 84.6% | 1.3% | PORTLAND WFO, OR 8.9 mi · 5 within 15 mi spanning 7.15″ |
Built pre-1980, pre-1960 and pre-1950 are nested shares of all housing units, each summed from the Census decade buckets listed in the methodology. The pre-1960 column is the figure this site's city pages quote as "built before 1960". Until , the pre-1960 values were published in the pre-1950 column; the revision log records what moved.
Wetter soil classes means the share of the city's mapped area whose dominant USDA drainage class is somewhat poorly, poorly or very poorly drained. Soil unrated is the share with no drainage class at all — Urban land map units and water, which the soil survey does not rate. Both are percentages of the same total, so where the unrated share is large the rated figure is describing a minority of the city. Portland's 50.9% is the highest in the table, in the city with the oldest housing — the survey is least informative exactly where this site most often works.
Places excluded
- Clackamas, OR — An unincorporated community with no Census place boundary — it does not appear in the 2024 Census gazetteer for Oregon at all. With no boundary there is no ACS place estimate and nothing to clip the soil survey to. Figures for the surrounding area would have to come from a county or tract aggregation, which is a different geography and would not be comparable with the rows above.
Methodology
Every figure was pulled from a public interface on , and the housing-age figures again on . Nothing was transcribed from a secondary site, and nothing was estimated, imputed or filled in. The queries are printed here so you can re-run them rather than take this page's word for the result.
Precipitation
NOAA NCEI data access service, datasets normals-annualseasonal-1991-2020 and
normals-monthly-1991-2020. Stations were found by bounding-box search over the
metro, then filtered to those whose annual normal carries at least 20 years of record. Annual normals and day-count normals are read out unchanged. The
October–March total is derived by this site: NOAA publishes meteorological seasons,
and the wet season here does not align with them, so the six monthly normals were summed.
The arithmetic is ours; the inputs are NOAA's.
https://www.ncei.noaa.gov/access/services/data/v1
?dataset=normals-annualseasonal-1991-2020
&stations=USW00024229,...
&dataTypes=ANN-PRCP-NORMAL,ANN-PRCP-AVGNDS-GE010HI,
ANN-PRCP-AVGNDS-GE050HI,ANN-PRCP-AVGNDS-GE100HI
&format=json&includeAttributes=true&includeStationLocation=true Housing age
US Census Bureau, American Community Survey 2019–2023 5-year estimates, table
B25034 (year structure built) and B25035 (median year built), one
request per Census place GEOID. The three shares are sums of B25034 buckets divided by total
units: pre-1950 is “1939 or earlier” plus “1940 to 1949”;
pre-1960 adds “1950 to 1959”; pre-1980 adds “1960 to 1969”
and “1970 to 1979”. The published margin of error on each median is carried through to the
table above and into the downloads.
The housing-age columns were re-pulled for all eighteen places on . Units, medians, margins of error and pre-1980 shares matched the original pull exactly; the pre-1950 column did not, because it had been summed through the 1950s bucket. It was corrected, and the pre-1960 figures it had been carrying are now published under their own name.
https://data.census.gov/api/access/data/table
?id=ACSDT5Y2023.B25034&g=1600000US4159000 Soil drainage
USDA NRCS Soil Data Access. Each city's boundary was taken from the Census TIGERweb places
service, generalised, and used as the area of interest for a clipped map-unit intersection.
The resulting polygons were joined to muaggatt.drclassdcd — NRCS's own dominant-
condition drainage class for each map unit — and the areas summed by class. Percentages are
of total mapped area including the unrated share.
~DeclareGeometry(@aoi)~
select @aoi = geometry::STGeomFromText('MULTIPOLYGON((...))', 4326).MakeValid()
~DeclareIdGeomTable(@intersectedPolygonGeometries)~
~GetClippedMapunits(@aoi,polygon,geo,@intersectedPolygonGeometries)~
SELECT m.drclassdcd,
CAST(SUM(GEOGRAPHY::STGeomFromWKB(g.geom.MakeValid().STAsBinary(),4326).STArea()) AS INT)
FROM @intersectedPolygonGeometries g
JOIN muaggatt m ON m.mukey = g.id
GROUP BY m.drclassdcd
Two known imprecisions, stated rather than smoothed over. City boundaries were generalised
before the intersection, and interior holes (enclaves) were not subtracted — so mapped area
runs slightly above Census land area for most cities. Neither materially moves a percentage,
and both are visible in the soil_mapped_sq_km column, which is published so you
can see the discrepancy rather than having to trust that it is small.
Variables: what each one supports, and what it does not
The limitation column is the more important half. A variable used past what it can support is worse than no variable at all, because it arrives with a federal agency's name attached.
- Annual precipitation normal Measured
-
Useful for: Establishes how much water the ground around a house has to shed, and shows how sharply that varies across a metro that is often described as if it had one climate.
Cannot support: A normal is a 30-year average for a single gauge. It is not a value for the surrounding city, and it does not describe any individual year — the wet season that floods a crawl space is a storm sequence, not an annual total.
- October–March precipitation and its share of the annual total Derived
-
Useful for: The most directly relevant climate figure for crawl space water management: it shows that between 72% and 77% of the year’s precipitation at every published station falls in six months. Drainage that copes with the annual average copes with nothing.
Cannot support: Derived by this site by summing NOAA’s published monthly normals — the arithmetic is ours, the inputs are NOAA’s. NOAA publishes meteorological seasons (Dec–Feb, and so on); October–March was chosen because it matches the Pacific Northwest wet season rather than the calendar, and that choice is an editorial one.
- Average days per year at or above 0.10, 0.50 and 1.00 inches Measured
-
Useful for: Separates frequency from intensity. Portland’s reputation is for persistent drizzle, and the day-count normals show that directly: many days of light rain, comparatively few heavy ones. Different failure modes follow from each.
Cannot support: A daily total, not an hourly rate. A crawl space floods on intensity over hours, and these normals cannot show that. They are also not a trend: nothing here says whether heavy days are becoming more common.
- Median year built, and share of housing built before 1980, before 1960 and before 1950 Measured
-
Useful for: Older housing stock means a larger share of homes were built under earlier codes, and under earlier expectations about ground cover, ventilation and insulation. It is the closest publicly available proxy for how much of a city’s housing predates modern crawl space practice.
Cannot support: Covers ALL housing units, apartments included, not single-family homes — and the ACS does not ask about foundation type, so nothing here identifies which units even have a crawl space. These are survey estimates with sampling error; the published margin of error on each median is given. Age is not condition: an old house with a maintained crawl space is in better shape than a new one with a blocked downspout.
- Share of mapped area in wetter soil drainage classes Derived
-
Useful for: Drainage class is the soil scientist’s summary of how readily water moves out of the ground, and it varies enormously across this metro — from under 5% of mapped area in the wetter classes to over 80%. It is the variable most directly connected to whether water sits against a foundation.
Cannot support: Describes natural soil in place. It says nothing about the fill under a specific house, the grading of that lot, or where its downspouts discharge — and those usually matter more at the scale of one crawl space. SSURGO also assigns no drainage class to Urban land map units or water, so the unrated share is published per city; in Portland it is more than half the mapped area, which is why Portland’s soil figures are the weakest in the table.
- Spread among published stations within 15 miles Derived
-
Useful for: Quantifies how much the choice of station changes the answer. Where it is large, no single station describes that city — which is the reason this dataset publishes no city-level rainfall figure.
Cannot support: A range, not an uncertainty estimate. It reflects real geographic variation in rainfall as much as any error, and a large spread is a fact about the terrain rather than a defect in the measurements.
Variables considered and rejected
A dataset that shows only what it has looks complete. One that shows what it rejected, and why, lets you judge whether the selection was driven by rigour or by whatever happened to be easy to obtain. Seven variables were researched and not published.
- Crawl space failure, moisture or mould rates
-
Considered because: It is the variable everybody actually wants, and its absence is the reason the rest of this page has to work so hard.
Rejected because: No such dataset exists for this metro, publicly or privately, and this site holds none. Every figure of this kind in circulation traces back to a company selling remediation.
What it would take: Instrumented measurement across a sample of real crawl spaces, stratified by construction era and by neighbourhood, sustained over multiple wet seasons. That is a research programme, not a page.
- A composite crawl space risk score
-
Considered because: The three published variables could be combined into one number per city, and it would be the most linkable thing on this site.
Rejected because: A score implies a validated relationship between rainfall, soil, housing age and actual crawl space failure. No such model has been published for this metro or, as far as we can find, anywhere. The weights would be invented, and the invented part would be the part everybody quoted. Three defensible variables plus one invented weighting is not four-quarters defensible; it is a fabrication wearing the other three as credentials.
What it would take: Outcome data to fit and validate against — which is the previous row. Until that exists, a score cannot be built honestly, only asserted.
- Foundation type: what share of homes have a crawl space
-
Considered because: It would turn housing-age context into something far more directly useful, and it is the first question an inspector or agent asks of this table.
Rejected because: The American Community Survey does not ask about foundation type, and no Oregon or Washington agency publishes it at city resolution. The Census Bureau’s Survey of Construction reports foundation type only for NEW single-family homes, and only by census division — the Pacific division spans Alaska to California, which is useless at this scale and worse than useless if quoted as local. County assessor records were then checked directly, on 29 August 2026, and none of the four counties this metro spans publishes the field in bulk: Clark County’s downloadable residential sales files do not enumerate building characteristics; Washington County routes to its InterMap parcel viewer and Clackamas County to CMap, neither with a documented bulk export carrying foundation type; and the PortlandMaps API covering Multnomah County requires a registered key. Assembling this from four parcel viewers would produce four incompatible schemas and, at best, coverage of one county — which is the inconsistent geographic resolution this dataset already refuses elsewhere.
What it would take: A bulk assessor extract carrying a foundation or basement field, obtained from each of the four county assessors by direct request, with a written mapping between their four vocabularies. That is a records-request project rather than a query, and it would still need all four to say yes — one county alone would not be publishable here.
- FEMA flood-zone coverage per city
-
Considered because: It is authoritative, mapped, and available — the National Flood Hazard Layer would support a "share of city in a Special Flood Hazard Area" column.
Rejected because: It would be the most misread column on the page. Most Portland crawl space water is perched groundwater, surface runoff and roof discharge, not riverine or coastal flooding. A flood-zone percentage sitting next to soil drainage in the same table would be read as a crawl space risk indicator, and a homeowner well outside any SFHA would take false comfort from it.
What it would take: A demonstrated relationship between SFHA status and crawl space water intrusion. We are not aware of one, and publishing the column while disclaiming the inference would not stop the inference.
- Depth to groundwater / winter water table
-
Considered because: Directly relevant — a high winter water table is a common cause of standing water under a house — and the Oregon Water Resources Department holds well-log data.
Rejected because: Well logs are point observations of wildly varying vintage, depth and quality, recorded for drilling rather than for hydrology. They cannot be aggregated into a comparable city-level statistic without a modelling step this site cannot validate, and a seasonal high water table is precisely the thing an annual point reading does not capture.
What it would take: A published, maintained water-table surface for the metro. Nothing at that resolution appears to exist.
- Elevation and topography
-
Considered because: Hillside lots behave differently, and the site already writes about curtain drains on sloping ground.
Rejected because: A mean elevation for a city is not a fact about any house in it. What matters is the slope of one lot and what is uphill of it, which no city-level statistic can carry. West Linn and Portland both span hundreds of feet of relief; a single number for either would be true and useless.
What it would take: Parcel-level slope, which is a per-property question — the sort a site visit answers and a table cannot.
- Radon-related code geography
-
Considered because: It is real, it is county-level, it is authoritative, and it genuinely constrains crawl space design across three metro counties.
Rejected because: Not rejected on quality — it is simply not a climate or housing measurement, and it is already published where it belongs, on the Oregon code pages, sourced to the Building Codes Division rather than restated here. Duplicating a regulatory claim into a data table is how the two versions drift apart.
What it would take: Nothing. See the Oregon reference section, which carries it with its own last-checked date.
Download
Both files are generated at build time from the same data the page reads, so a download cannot fall out of step with the tables. Each carries the sources, the retrieval date, the limitations and the two-table warning inside the file itself, so it still says what it is once it has been separated from this page.
Field dictionary
The same field names are used in both formats, and this table is the source they are built from.
Station table fields
| Field | Type | Description |
|---|---|---|
station_id | string | NOAA GHCN station identifier. Stable; safe to join on and to look up directly at NCEI. |
station_name | string | Station name as NOAA publishes it. |
latitude | number | Decimal degrees, WGS84. |
longitude | number | Decimal degrees, WGS84. |
elevation_m | number | Station elevation in metres, as published by NOAA. |
annual_precip_in | number | 1991–2020 annual precipitation normal, inches. A 30-year statistic for this instrument, not for any surrounding area. |
oct_mar_precip_in | number | October through March total, inches, summed by this site from NOAA’s published monthly normals. Derived, not measured. |
oct_mar_pct_of_annual | number | October–March as a percentage of the annual normal. Derived. |
days_ge_0_10_in | number | Average number of days per year with precipitation at or above 0.10 inches. |
days_ge_0_50_in | number | Average number of days per year at or above 0.50 inches. |
days_ge_1_00_in | number | Average number of days per year at or above 1.00 inches. A daily total, not an hourly intensity. |
ncei_completeness_flag | enum C, S, R, P, E | NOAA’s own completeness flag, republished unchanged: C complete, S standard, R representative, P provisional, E estimated. Filter on it if your use needs the strongest stations only. |
years_of_record | integer | Years of record behind the annual normal, as published by NOAA. Every published station has at least 20. |
City table fields
| Field | Type | Description |
|---|---|---|
city_slug | string | Stable machine identifier, matching this site’s service-area pages. |
city | string | Place name. |
state | string | OR or WA. |
census_place_geoid | string | Census place GEOID. The join key for any other Census table. |
land_area_sq_mi | number | Census land area, square miles. Excludes water. |
housing_units | integer | Total housing units, ACS 2019–2023 5-year estimate. ALL units, apartments included — not single-family homes. |
median_year_built | integer | Median year structure built, ACS table B25035. |
median_year_built_moe | integer | Published margin of error on the median, in years, at 90% confidence. |
pct_built_pre_1980 | number | Percentage of housing units built in 1979 or earlier: ACS table B25034, “1939 or earlier” through “1970 to 1979”, divided by total units. |
pct_built_pre_1960 | number | Percentage built in 1959 or earlier: B25034 “1939 or earlier”, “1940 to 1949” and “1950 to 1959”. The figure this site’s city pages quote as “built before 1960”. Added 28 September 2026; before that date these values were published, wrongly, as pct_built_pre_1950. |
pct_built_pre_1950 | number | Percentage built in 1949 or earlier: B25034 “1939 or earlier” and “1940 to 1949” only. Corrected 28 September 2026: until then this column held the 1959-or-earlier share now published as pct_built_pre_1960, so any copy downloaded before that date overstates every value here. |
soil_mapped_sq_km | number | Area of SSURGO map units intersecting the place boundary, square kilometres. Slightly exceeds land area because the boundary is generalised and enclaves are not subtracted. |
pct_soil_wetter_classes | number | Percentage of mapped area whose dominant drainage class is somewhat poorly, poorly or very poorly drained. Percentage of TOTAL mapped area, including the unrated share — so read it alongside the next column. |
pct_soil_unrated | number | Percentage of mapped area with no drainage class: Urban land map units and water. Where this is high, the soil figures for that city are weak. |
nearest_station_id | string | Nearest published station to the city’s Census internal point. A POINTER, not an assertion that this station’s rainfall describes the city. |
nearest_station_miles | number | Great-circle distance from the city’s internal point to that station, miles. |
stations_within_15_mi | integer | Count of published stations within 15 miles of the internal point. |
station_spread_in | number | Highest minus lowest annual normal among those stations, inches. Empty where only one qualifies. Where this is large, no single station describes the city. |
How to cite this, and how not to use it
Use this form, or any form carrying the publisher, the dataset name and the update date:
Portland Crawlspace Pros. "Portland Metro Crawlspace Climate and Housing Data." Compiled from NOAA, US Census Bureau and USDA NRCS data. Updated September 2026. PortlandCrawlspacePros.com.
The underlying data is US federal public-domain data and you owe nobody anything for it. What this site added is the compilation: the station selection rule, the city pairing, the soil intersection and the limitations. The underlying data is US federal public-domain data from NOAA, the US Census Bureau and the USDA. This compilation - the station selection, the city pairing, the soil intersection and the limitations - may be quoted and republished with attribution to Portland Crawlspace Pros and a link to the dataset page. Please carry the measurement period with any figure.
Reasonable uses
- Explaining why water management matters more in some parts of this metro than others, with the soil and rainfall figures attached and their geography stated.
- Establishing what share of a city's housing predates a given code era — as housing-stock context, not as a claim about any address.
- Comparing rainfall between two named stations, with the distance from your subject property given.
- Sourcing a rainfall or housing-age figure in a report or listing, cited to NOAA or the Census Bureau directly. They are the authorities; this page is a convenience.
Uses this data cannot support
- Any claim about crawl space failure, mould or moisture rates. Nothing here measures those, in any city, at any confidence.
- A per-city rainfall figure. Precipitation is measured at points that disagree with each other by up to 15.4 inches within fifteen miles. Name the station.
- A risk ranking of cities. The columns are not commensurable and there is no validated model to combine them with.
- A statement about a specific property. Soil drainage describes natural soil in place; what matters at one address is that lot's fill, grading and downspouts.
- An inference from housing age to condition. Older stock means more homes built under earlier codes. It does not mean those homes have problems.
Corrections and maintenance
- Next scheduled review: . The ACS releases a new 5-year estimate each December, and SSURGO is revised on its own schedule. NOAA's normals update once a decade, so the precipitation figures will stand until the 2001–2030 normals are published.
- Found an error? If a figure here does not match what the source says, tell us — name the table, the row and the column. Substantive corrections are published permanently in the public corrections ledger with the wording as it stood.
- The commercial interest is disclosed. This site earns money referring homeowners to independent licensed contractors. It is not a contractor. That is a reason to read this data critically, and it is also why the risk score is absent: the incentive to publish one runs exactly the wrong way.
Revisions
If you cited a figure from this dataset, this is where you check whether it has moved since.
The same log is written into the header of the CSV and the revisions array of
the JSON, so a file saved before a change can be checked against it.
-
Housing-age columns re-pulled from ACS 2019–2023 tables B25034 and B25035 for all eighteen places. Housing units, median year built, its margin of error and the pre-1980 share matched exactly. The column published as pct_built_pre_1950 did not: it had summed the 1950–1959 bucket in, so it held the share built before 1960 (Portland 45.3%, Milwaukie 37.4%). Those values are now published under their own name, pct_built_pre_1960, and pct_built_pre_1950 carries the true 1949-or-earlier share (Portland 34.3%, Milwaukie 16.5%). Every value in pct_built_pre_1950 moved; nothing else did. Ledger entry.
Sources behind this dataset
Every figure in both tables comes from one of these. Each is the federal body that holds the data rather than a redistribution of it, and each was queried through the public interface documented in the methodology section above, so any figure here can be re-pulled and checked rather than taken on trust.
-
NOAA National Centers for Environmental Information, U.S. Climate Normals (1991–2020) — Annual/Seasonal and Monthly (normals-annualseasonal-1991-2020, normals-monthly-1991-2020) Open dataset Checked
Every precipitation figure in the climate and housing dataset: annual and monthly precipitation normals, the average number of days per year at or above 0.10, 0.50 and 1.00 inches, and the completeness flag and years of record NCEI publishes alongside each value. Retrieved through the NCEI data access service.
Note: A normal is a 30-year statistic for one instrument at one point, not a value for the surrounding city. NCEI publishes a completeness flag with every value and this site republishes it, because a station with 20 years of record and one with 30 are not equally strong evidence.
-
United States Census Bureau, American Community Survey 5-Year Estimates — Year Structure Built (B25034) and Median Year Structure Built (B25035) (ACS 2019–2023 5-year estimates, tables ACSDT5Y2023.B25034 and ACSDT5Y2023.B25035) Open dataset Checked
The housing-age columns for every city in the climate and housing dataset: total housing units, median year built with its published margin of error, and the shares of units built before 1980, before 1960 and before 1950, each summed from the B25034 decade buckets. All eighteen places were re-pulled through data.census.gov on 2026-09-28: units, medians, margins and pre-1980 shares matched, and the column previously published as the pre-1950 share was found to hold the pre-1960 share and was corrected.
Note: Survey estimates carrying sampling error, not a census of buildings. They cover ALL housing units in a place, apartments included, rather than single-family homes — and the ACS does not ask about foundation type, so nothing here identifies which units have a crawl space.
-
USDA Natural Resources Conservation Service, Soil Survey Geographic Database (SSURGO), via Soil Data Access (muaggatt.drclassdcd — drainage class, dominant condition) Open dataset Checked
The soil drainage columns: the share of each city’s mapped area whose dominant soil drainage class is somewhat poorly drained, poorly drained or very poorly drained, and the share carrying no drainage class at all. Computed by intersecting each Census place boundary with the SSURGO map units and area-weighting the result.
Note: SSURGO assigns no drainage class to Urban land map units or to water, so the survey is least informative under exactly the dense older housing this site most often works on. The unrated share is published per city for that reason. Drainage class also describes natural soil in place — not the fill, the grading or the downspout run at any individual house.
-
United States Census Bureau, TIGER/Line geography — incorporated places and census designated places Open dataset Checked
The city boundaries used as the area of interest for the soil intersection, and the land area and internal point used to compute each city’s distance to its nearest precipitation station.
Note: City limits, not neighbourhoods and not ZIP codes. Two places this site serves are unincorporated and appear here differently or not at all.
-
NOAA National Weather Service, Portland, Portland Climate Book — precipitation normals (1991–2020 climate normals) Checked
Portland-area rainfall totals and their seasonal distribution, the basis for every statement on this site about the wet season and its timing.
Sources last checked between and ; the date beside each one is when it was last opened. Where a figure comes from a document that is revised on a schedule, the edition or version is named above so you can confirm it against the current one yourself.
Connect with a Local Crawlspace Expert
Get matched with a licensed local contractor - Oregon CCB, or Washington L&I across the river - for a free in-home inspection, with no obligation.