The problem is now solved (in theory).
Well, it's not the functions per se that's the problem, it's the lack of
a useful index on the _expression_.
Each weather station has a known lifespan (per climate category). That is, not all weather stations between 1880 and 2009 collected data. For example, one weather station monitored the maximum daily temperature between 2006-11-29 and 2009-12-31. Some stations span more than 30 years, but I believe those are in the minority (e.g., 1896-12-01 to 1959-01-31). (I'll be able to verify once the analysis is finished.)
I will add another table that maps the stations to category and min/max dates. I can then use this reference table which should (theory part here) tell the planner to use the index.
What is really impressive, though... If my understanding is correct...
PostgreSQL scanned 43 million rows 78 times, returning results in ~90 sec.
Thanks again for all your help, everybody. I sincerely appreciate your patience, comments, and ideas.
Dave