Skip to content

Instantly share code, notes, and snippets.

@darribas
Created March 20, 2014 17:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save darribas/9668899 to your computer and use it in GitHub Desktop.
Save darribas/9668899 to your computer and use it in GitHub Desktop.
Extract NOAA's Climate Normals data
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import urllib2\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Climate data from NOAA\n",
"\n",
"* Dani Arribas-Bel ([@darribas](http://twitter.com/darribas))\n",
"\n",
"This notebook presents the process of accessing NOAA's servers to extract average climate data at the station level. In particular, I am interested in yearly averages, but the logic would be the same for any other metric in the dataset.\n",
"\n",
"Data come from the [1981-2010 Normals Data](ttp://www.ncdc.noaa.gov/land-based-station-data/climate-normals/1981-2010-normals-data), and I will extract average values to characterize the climate of each weather station, which will also be plotted at the end.\n",
"\n",
"The dataset can be accessed through FTP on the following url:\n",
"\n",
"[`ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/products/temperature/`](ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/products/temperature/)\n",
"\n",
"Information about the data is found in the entre file:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"readme = urllib2.urlopen('ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/readme.txt')\n",
"print readme.read()[:200]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"README FILE FOR NOAA'S 1981-2010 CLIMATE NORMALS\n",
"\n",
"OUTLINE\n",
"\n",
"I. CONTENTS\n",
"II. FILENAMING\n",
"III. FILE FORMATS\n",
"IV. UNITS\n",
"V. SPECIAL VALUES\n",
"VI. FLAGS\n",
"\n",
"I. CONTENTS\n",
"\n",
" readme.txt - this file\n",
" statu\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We are going to extract annual (`ann`) average (`normal`) for the following variables:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vars2xtr = {\n",
" 'cldd': 'cooling degree days', \\\n",
" 'cldh': 'cooling degree hours', \\\n",
" 'clod': 'clouds', \\\n",
" 'dewp': 'dew point temperature', \\\n",
" 'dutr': 'diurnal temperature range', \\\n",
" 'hidx': 'heat index', \\\n",
" 'htdd': 'heating degree days', \\\n",
" 'htdh': 'heating degree hours', \\\n",
" 'prcp': 'precipitation', \\\n",
" 'pres': 'sea level pressure', \\\n",
" 'snow': 'snowfall', \\\n",
" 'snwd': 'snow depth', \\\n",
" 'tavg': 'mean temperature', \\\n",
" 'temp': 'temperature', \\\n",
" 'tmax': 'maximum temperature', \\\n",
" 'tmin': 'minimum temperature', \\\n",
" 'wchl': 'wind chill', \\\n",
" 'wind': 'wind'\n",
" }"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Locating files\n",
"\n",
"Copied from the `source_path` is a table of the file directory:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"source_path = 'ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/products/temperature/'"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": true,
"input": [
"files = '''File:ann-cldd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base70.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-base72.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-cldd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-dutr-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base40.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-htdd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tavg-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth080.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth090.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-grth100.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmax-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth000.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth010.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth020.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-avgnds-lsth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:ann-tmin-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base70.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-base72.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-cldd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-dutr-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base40.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-htdd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tavg-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth080.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth090.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-grth100.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmax-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth000.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth010.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth020.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-avgnds-lsth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:djf-tmin-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base45.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base50.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base55.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base57.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base60.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base70.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-base72.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-cldd-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-dutr-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-dutr-stddev.txt \t17535 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base40.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base45.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base50.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base55.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base57.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-base60.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-htdd-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-tavg-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-tavg-stddev.txt \t17535 KB \t30/06/11 \t00:00:00\n",
"File:dly-tmax-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-tmax-stddev.txt \t17535 KB \t30/06/11 \t00:00:00\n",
"File:dly-tmin-normal.txt \t20658 KB \t30/06/11 \t00:00:00\n",
"File:dly-tmin-stddev.txt \t17535 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base70.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-base72.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-cldd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-dutr-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base40.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-htdd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tavg-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth080.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth090.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-grth100.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmax-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth000.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth010.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth020.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-avgnds-lsth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:jja-tmin-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base70.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-base72.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-cldd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-dutr-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base40.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-htdd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tavg-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth080.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth090.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-grth100.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmax-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth000.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth010.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth020.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-avgnds-lsth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mam-tmin-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base45.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base50.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base55.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base57.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base60.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base70.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-base72.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-cldd-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-dutr-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-dutr-stddev.txt \t635 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base40.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base45.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base50.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base55.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base57.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-base60.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-htdd-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tavg-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tavg-stddev.txt \t635 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth040.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth050.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth060.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth070.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth080.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth090.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-grth100.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-avgnds-lsth032.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmax-stddev.txt \t635 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth000.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth010.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth020.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth032.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth040.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth050.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth060.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-avgnds-lsth070.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-normal.txt \t748 KB \t30/06/11 \t00:00:00\n",
"File:mly-tmin-stddev.txt \t635 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base70.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-base72.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-cldd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-dutr-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base40.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base45.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base50.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base55.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base57.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-base60.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-htdd-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tavg-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth080.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth090.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-grth100.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmax-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth000.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth010.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth020.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth032.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth040.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth050.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth060.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-avgnds-lsth070.txt \t184 KB \t30/06/11 \t00:00:00\n",
"File:son-tmin-normal.txt \t184 KB \t30/06/11 \t00:00:00\n",
"'''"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"paths = []\n",
"for file in files.split('\\n'):\n",
" file = file.strip('File:').split(' ')[0]\n",
" if ('ann' in file) and ('normal' in file):\n",
" paths.append(file)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We get to the files we can access on annual averages:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in paths:\n",
" name = vars2xtr[i.strip('.txt').split('-')[1]]\n",
" print '%s | %s'%(i, name)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"ann-cldd-normal.txt | cooling degree days\n",
"ann-dutr-normal.txt | diurnal temperature range\n",
"ann-htdd-normal.txt | heating degree days\n",
"ann-tavg-normal.txt | mean temperature\n",
"ann-tmax-normal.txt | maximum temperature\n",
"ann-tmin-normal.txt | minimum temperature\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extracting the data"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def load_txt_file(url):\n",
" dat = pd.read_table(url, header=None, squeeze=True)\n",
" dat = dat.apply(parse_line)\n",
" return dat\n",
"\n",
"def parse_line(line):\n",
" stnid = line[:11]\n",
" val = line[11:-1]\n",
" flag = line[-1:]\n",
" return pd.Series({'stnid': stnid, 'val': val, 'flag': flag})"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"db_path = 'weather_data_stations.csv'\n",
"try:\n",
" db = pd.read_csv(db_path)\n",
"except:\n",
" db = []\n",
" for var in paths:\n",
" print 'Downloading: ', var\n",
" dat = load_txt_file(source_path + var)\n",
" dat['var'] = var\n",
" db.append(dat)\n",
" db = pd.concat(db, ignore_index=True)\n",
" db.to_csv(db_path, index=False)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Geo-referencing the stations\n",
"\n",
"Station info is given in a different file also accessible via FTP. The structure of this file is (as copied from the README file):\n",
"\n",
"```\n",
" ------------------------------\n",
" Variable Columns Type\n",
" ------------------------------\n",
" ID 1-11 Character\n",
" LATITUDE 13-20 Real\n",
" LONGITUDE 22-30 Real\n",
" ELEVATION 32-37 Real\n",
" STATE 39-40 Character\n",
" NAME 42-71 Character\n",
" GSNFLAG 73-75 Character\n",
" HCNFLAG 77-79 Character\n",
" WMOID 81-85 Character\n",
" METHOD*\t 87-99 Character\n",
" ------------------------------\n",
"```\n",
"\n",
"We can parse it and read it in to link it up to `db`, keeping only data values with quality enough (i.e. `C`, `S`, `R`)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def load_stations(url):\n",
" dat = pd.read_table(url, header=None, squeeze=True)\n",
" dat = dat.apply(parse_stn)\n",
" return dat\n",
"\n",
"def parse_stn(line):\n",
" d = {\n",
" 'stnid': line[:11], \\\n",
" 'lat': float(line[12:20]), \\\n",
" 'lon': float(line[21:30]), \\\n",
" 'ele': float(line[31:37]), \\\n",
" 'state': line[38:40], \\\n",
" 'name': line[41:71], \\\n",
" 'gsnflag': line[72:75], \\\n",
" 'hcnflag': line[76:79], \\\n",
" 'wmoid': line[80:85], \\\n",
" 'method': line[86:99]\n",
" }\n",
" return pd.Series(d)\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"stations_url = 'ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/station-inventories/allstations.txt'\n",
"try:\n",
" geodb = pd.read_csv('weather_geo.csv')\n",
"except:\n",
" stations = load_stations(stations_url)\n",
" geodb = db.join(stations.set_index('stnid')[['lon', 'lat', 'ele']], on='stnid')\n",
" filt = geodb['flag'].apply(lambda x: x in ['C', 'S', 'R'])\n",
" geodb = geodb[filt]\n",
" geodb.to_csv('weather_geo.csv', index=False)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Both `stations` and `db` can be linked up by the station id:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"geodb.info()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 38047 entries, 0 to 38046\n",
"Data columns (total 8 columns):\n",
"Unnamed: 0 38047 non-null int64\n",
"flag 38047 non-null object\n",
"stnid 38047 non-null object\n",
"val 38047 non-null int64\n",
"var 38047 non-null object\n",
"lon 38047 non-null float64\n",
"lat 38047 non-null float64\n",
"ele 38047 non-null float64\n",
"dtypes: float64(3), int64(2), object(3)"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use PySAL plotting capabilities to get a quick plot of the station locations:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pysal as ps\n",
"from pysal.contrib.viz import mapping as maps"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f, ax = plt.subplots(figsize=(12, 6))\n",
"sc = plt.scatter(stations.lon, stations.lat, \\\n",
" linewidth=0, c='blue', s=0.2, marker='.')\n",
"ax = maps.setup_ax([sc], ax)\n",
"plt.title('Location of NOAA weather stations')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAqsAAAFsCAYAAADrHvBgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYlXX6x/Eb1ELFBcVEXFPKXWlcw0rTFpeyxsbGFolq\npMaatBo108zMtDJLp2zsWKlHM83J0jKXiDS31Bas3Fc0hXJPTHB7fn98fg8HFC0X5AHfr+viQs76\nHOia6zP39/7e3yDHcRwDAAAAPCg4ry8AAAAAOBXCKgAAADyLsAoAAADPIqwCAADAswirAAAA8CzC\nKgAAADyLsArgjA0dOtS6det2wd/3o48+ssqVK1uJEiVsxYoVF/z985tWrVrZO++8k9eXcVby6r8x\nAN5DWAXyoWrVqtkXX3xxQd5r3rx5Vrly5Wy39e3b18aMGXNB3j+rf//73/bmm2/agQMHrGHDhifd\nHxwcbA0aNLCs46P79+9v999/f+bPGRkZ1rdvX6tataoVK1bMrrzySnvllVdOei3Hcax69epWt27d\nU17PvHnzLDg42F5++eVz/GTnbuDAgda1a9dstwUFBVlQUJAnruV0vPTfGADvIawC+VBehZC85DiO\nbd261erUqXPax6WkpNjkyZMzfz7x99S5c2f78ssvbdasWZaWlmYTJkwwn89nPXr0yPa4r776yjIy\nMmznzp32zTff5Phe48ePt3r16pnf7z/LT5U/OI5jnB8DIK8QVoECJCMjw3r27GkVK1a0ihUr2uOP\nP26HDx/OvH/69OkWHR1tpUqVsqioKJszZ46ZmY0dO9bq1KljJUuWtBo1apjP5zMzs4MHD1q7du1s\nx44dVqJECStZsqSlpKScVDmbMWOG1a1b18LCwuz666+3NWvWZN5XrVo1Gz58uDVs2NBKly5tXbp0\nsYyMjByv33EcGzx4sFWrVs3Kly9v9913n/3222+WkZFhJUqUsGPHjlnDhg3tiiuuOOXvoHfv3vbs\ns8/asWPHMl/T9cUXX9jnn39uH374odWpU8eCg4OtWbNmNnHiRBs1apRt3Lgx87Hjx4+3O+64w267\n7TYbP378Se9z8OBB+/DDD2306NG2detW+/bbb095TS1btrRp06aZmdmiRYssODjYPvvss8xruuqq\nqzIf++6771qdOnWsTJky1rZtW9u6dWvmfT169LAqVapYqVKlrHHjxrZw4UIzM5s9e7YNHTrUpkyZ\nYiVKlMj2elu2bLFrrrnGSpYsaTfffLPt3r07876vv/7aYmJiLCwszKKjo23+/PmZ97Vq1cr69+9v\nLVq0sOLFi9vmzZtP+lwvvfSSVapUyUqWLGm1atWyxMTEU15LXv03tmvXLrvlllssLCzMypYta9dd\ndx3BG8hvHAD5TrVq1ZwvvvjipNufeeYZ5+qrr3Z27tzp7Ny504mJiXGeeeYZx3EcZ+nSpU6pUqWc\nhIQEx3EcZ/v27c6aNWscx3GcmTNnOps2bXIcx3Hmz5/vFCtWzPnuu+8cx3GcefPmOZUqVcr2PgMH\nDnTuvfdex3EcZ+3atU7x4sWdhIQE5+jRo87LL7/sREVFOUeOHMm81mbNmjkpKSnOnj17nNq1azuj\nR4/O8XO98847TlRUlLN582YnLS3N6dSpk9O1a9fM+4OCgpyNGzee8vcSFBTkrF+/3mnUqJHz9ttv\nO47jOP369XPi4uIcx3GcPn36OK1atcrxuVWrVnXeeustx3Ec5+DBg07JkiWdhQsXOnPnznXCw8Od\nw4cPZ3u83+93oqKiHMdxnLvvvtv517/+dcrrGjBgQOb9L7zwglOjRg2nT58+juPob9azZ0/HcRzn\n448/dqKiopw1a9Y4x44dcwYPHuzExMRkvs7EiROdPXv2OMeOHXOGDx/uREREOBkZGY7j6G+S9Xfl\nOI7TsmVLp0aNGs769eudQ4cOOa1atXKeeuopx3Ec5+eff3bKli3rzJo1y3Ecx/n888+dsmXLOrt2\n7cp8btWqVZ1Vq1Y5x44dy/x7utasWeNUrlzZSUlJcRzHcZKTkzP/NjldS179N/bUU085Dz/8sHP0\n6FHn6NGjzsKFC0/5dwLgTVRWgQJk0qRJNmDAAAsPD7fw8HB79tlnbcKECWZm9s4779iDDz5obdq0\nMTOzyMhIq1mzppmZtW/f3i6//HIzM7vuuuvspptusgULFpiZ5ViFynrblClT7JZbbrE2bdpYoUKF\n7N///rcdOnTIFi9enPmYxx57zCIiIiwsLMxuvfVWS0pKyvH633vvPXvyySetWrVqVrx4cRs6dKhN\nnjzZjh8//qd/B8HBwfb888/b888/b0eOHMl2365duywiIiLH51WoUCGz6jht2jQrWbKktWjRwlq3\nbm1mZjNnzsz2+PHjx1vnzp3NTK0FkydPtqNHj+b42i1btsysWi5YsMD69u2b+fP8+fOtZcuWZmY2\nevRo69u3r9WsWdOCg4Otb9++lpSUZNu2bTMzs3vuucfCwsIsODjYnnjiCcvIyLC1a9eaWc5L9UFB\nQfbAAw9YVFSUhYSE2J133pn5u584caK1b9/e2rZta2ZmN9xwgzVu3DjzcwYFBVlcXJzVrl3bgoOD\nrXDhwtleu1ChQpaRkWErV660I0eOWJUqVax69eqnvJa8+m/skksusZSUFNuyZYsVKlTIWrRokePf\nCIB3EVaBAmTHjh1WtWrVzJ+rVKliO3bsMDOzn3/+2WrUqJHj82bNmmXNmze3smXLWlhYmH322WfZ\nlov/6D2rVKmS+XNQUJBVrlzZtm/fnnlb1oBYtGhRS0tLy/G1UlJSTrr+o0eP2i+//PKnrsXVrl07\nq1Spkr311lvZelbLlStnKSkpp/wc4eHhZqYg2qlTJzNTKLv99tuztQJs27bN5s2blxlW27Zta+np\n6ScFWlfz5s1t3bp19uuvv1pSUpLFxsbatm3bbPfu3bZ8+XK77rrrzMwsOTnZevToYWFhYZnL1maW\n+bt85ZVXrE6dOla6dGkLCwuz/fv3265du077uzjV7z45OdmmTp2a+V5hYWG2aNEiS01NzXz8iZue\nsoqKirIRI0bYwIEDrXz58nbXXXed8ndrlnf/jfXq1cuioqLspptusho1athLL730p94TgHcQVoEC\nJDIy0rZs2ZL589atW61ixYpmpuCxYcOGk56TkZFhd9xxh/Xu3dt+/fVX27t3r7Vv3z6zsvVHG7kq\nVqxoycnJmT87jmPbtm3LfN8Tne71crr+woULW/ny5U97DTl54YUXbMiQIfb7779n3tamTRtbunSp\n/fzzz9ke697WunVr+/nnny0xMdHGjx9vFSpUsAoVKtgHH3yQLVxNmDDBjh8/bu3bt7cKFSrY5Zdf\nbunp6Tn2tpqZFStWzBo1amQjRoyw+vXrW5EiRSwmJsaGDx9uUVFRVqZMGTNTOPf5fLZ3797Mr4MH\nD1rz5s1twYIFNmzYMJs6dart27fP9u7da6VKlfrTf6cTValSxbp27ZrtvQ4cOGC9e/fOfMwfveZd\nd91lCxYssOTkZAsKCrI+ffrk+Ly8/G8sNDTUXnnlFdu4caPNmDHDXn31VUtMTDzt+wHwFsIqkE8d\nPnzY0tPTM7+OHj1qd911lw0ePNh27dplu3btskGDBtm9995rZmYPPvigjR071hITE+348eO2fft2\nW7t2rR0+fNgOHz5s4eHhFhwcbLNmzbK5c+dmvk/58uVt9+7d9ttvv+V4HZ07d7aZM2daYmKiHTly\nxIYPH24hISEWExOT4+NzWvJ13XXXXfbaa6/Zli1bLC0tzZ5++mnr0qWLBQef+f9UtWzZ0urVq5ct\nQN5www3Wpk0bu+OOO2zVqlV27Ngx+/rrr61r167WvXt3q1Gjhk2YMMFq1apl69atsxUrVtiKFSts\n3bp1VqlSJXv//ffNTJXXgQMHZt6/YsUK+/DDD+2zzz6zPXv2nPJ6Ro0albnk36pVK3vjjTcyfzYz\ne/jhh23IkCG2atUqMzPbv3+/TZ061czMDhw4YIULF7bw8HA7fPiwDRo0KNvfJCIiwrZs2XLS7/dU\nv+97773XPvnkE5s7d64dO3bM0tPTbd68edmqlaf7W61bt84SExMtIyPDLr30UgsJCbFChQrleC15\n+d/Yp59+ahs2bDDHcaxkyZJWqFChzOsEkD8QVoF8qn379lasWLHMr0GDBln//v2tcePG1qBBA2vQ\noIE1btzY+vfvb2ZmTZo0sbFjx9rjjz9upUuXtlatWtnWrVutRIkS9p///MfuvPNOK1OmjL3//vt2\n2223Zb5PrVq17K677rLq1atbmTJlLCUlJdvorJo1a9rEiRPtX//6l5UrV85mzpxpn3zyyUk9jq7T\njd164IEHrGvXrnbddddZ9erVrVixYvb6669ne+7pnHj/4MGDbc+ePdlu//DDD+3666+3tm3bWokS\nJaxr1672j3/8I/N9/H6/de/e3S677LLMr/Lly9vDDz9sfr/fli5datu2bbNHHnkk22NuvfVWi4qK\nyjY2K6uWLVtaWlpa5pL/ddddZwcPHsz82czs9ttvtz59+liXLl2sVKlSVr9+/cyJDW3btrW2bdva\nlVdeadWqVbOiRYtmWxp3WxLKli1rjRs3zvF3kvV3X6lSJZs+fboNGTLELrvsMqtSpYoNHz48W9A7\n3e/bnVdbrlw5q1Chgu3atcuGDh2a47Xk5X9jGzZssBtvvNFKlChhMTEx9sgjj2T7PwgAvC/IOd3/\ndQYAAADyEJVVAAAAeBZhFQAAAJ5FWAUAAIBnEVYBAADgWYRVAAAAeBZhFQAAAJ5FWAUAAIBnEVYB\nAADgWYRVAAAAeBZhFQAAAJ5FWAUAAIBnEVYBAADgWYRVAAAAeBZhFQAAAJ5FWAUAAIBnEVYBAADg\n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\nAAAASUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x5c62550>"
]
}
],
"prompt_number": 26
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment