Blame | Last modification | View Log | Download
{"cells": [{"cell_type": "markdown","metadata": {},"source": ["## Case study\n","\n","In this case study we'll walk through using Python to fetch some data, clean it, and then graph it. This may be a short project, but it combines a number of features of the language we've dicussed, and gives you a chance to a see a project worked through from beginning to end. At almost every step we will also briefly call out alternatives and enhancements you can make.\n","\n","Global temperature change is the topic of much discussion. But those discussions are based on a global scale, Suppose I want to know what the temperatures have been doing near where I am? One way of finding out would be to get some historical data for my location and process that data and plot it to see exactly what's been happening. \n","\n","Fortunately, there are several sources of historical weather data that are freely available. We're going to talk through using data from the Global Historical Climatology Network, which has data from around the world. You may find other sources, which may have different data formats, but the steps and the processes we discuss here should be generally applicable to any data set. "]},{"cell_type": "markdown","metadata": {},"source": ["### Downloading the data\n","\n","The first step will be to get the data. There is an archive of daily historical weather data at https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/, which has a wide array of datay. The first step will be to figure out which files we want and exactly where they are, and then to download them. Once we have the data, we can move on to processing and ultimately displaying our results. \n","\n","In order to download the files, which are accessable via HTTPS, we will need the requests library. We can get requests with `pip install requests` at the command prompt. Once we have requests our first step will be to fetch the `readme.txt` file, which can guide us as the formats and location of the data files we'll want."]},{"cell_type": "code","execution_count": 11,"metadata": {},"outputs": [],"source": ["# import requests\n","\n","import requests"]},{"cell_type": "code","execution_count": null,"metadata": {},"outputs": [],"source": ["# get readme.txt file\n","\n","r = requests.get('https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/readme.txt')\n","readme = r.text"]},{"cell_type": "markdown","metadata": {},"source": ["When we look at the readme file, it looks something like this:"]},{"cell_type": "code","execution_count": 4,"metadata": {},"outputs": [{"name": "stdout","output_type": "stream","text": ["README FILE FOR DAILY GLOBAL HISTORICAL CLIMATOLOGY NETWORK (GHCN-DAILY) \n","Version 3.22\n","\n","--------------------------------------------------------------------------------\n","How to cite:\n","\n","Note that the GHCN-Daily dataset itself now has a DOI (Digital Object Identifier)\n","so it may be relevant to cite both the methods/overview journal article as well \n","as the specific version of the dataset used.\n","\n","The journal article describing GHCN-Daily is:\n","Menne, M.J., I. Durre, R.S. Vose, B.E. Gleason, and T.G. Houston, 2012: An overview \n","of the Global Historical Climatology Network-Daily Database. Journal of Atmospheric \n","and Oceanic Technology, 29, 897-910, doi:10.1175/JTECH-D-11-00103.1.\n","\n","To acknowledge the specific version of the dataset used, please cite:\n","Menne, M.J., I. Durre, B. Korzeniewski, S. McNeal, K. Thomas, X. Yin, S. Anthony, R. Ray, \n","R.S. Vose, B.E.Gleason, and T.G. Houston, 2012: Global Historical Climatology Network - \n","Daily (GHCN-Daily), Version 3. [indicate subset used following decimal, \n","e.g. Version 3.12]. \n","NOAA National Climatic Data Center. http://doi.org/10.7289/V5D21VHZ [access date].\n","--------------------------------------------------------------------------------\n","\n","I. DOWNLOAD QUICK START\n","\n","Start by downloading \"ghcnd-stations.txt,\" which has metadata for all stations.\n","\n","Then download one of the following TAR files:\n","\n"," - \"ghcnd-all.tar.gz\" if you want all of GHCN-Daily, OR\n"," - \"ghcnd-gsn.tar.gz\" if you only want the GCOS Surface Network (GSN), OR\n"," - \"ghcnd-hcn.tar.gz\" if you only want the U.S. Historical Climatology Network \n"," (U.S. HCN).\n","\n","Then uncompress and untar the contents of the tar file, \n","e.g., by using the following Linux command:\n","\n","tar xzvf ghcnd_xxx.tar.gz\n","\n","Where \"xxx\" stands for \"all\", \"hcn\", or \"gsn\" as applicable. The files will be \n","extracted into a subdirectory under the directory where the command is issued.\n","\n","ALTERNATIVELY, if you only need data for one station:\n","\n"," - Find the station's name in \"ghcnd-stations.txt\" and note its station\n"," identification code (e.g., PHOENIX AP (Airport) is \"USW00023183\"); and\n"," - Download the data file (i.e., \".dly\" file) that corresponds to this code\n"," (e.g., \"USW00023183.dly\" has the data for PHOENIX AP). \n"," Note that the \".dly\" file is located in the \"all\" subdirectory.\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","II. CONTENTS OF ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily\n","\n","all: Directory with \".dly\" files for all of GHCN-Daily\n","gsn: Directory with \".dly\" files for the GCOS Surface Network \n"," (GSN)\n","hcn: Directory with \".dly\" files for U.S. HCN\n","by_year: Directory with GHCN Daily files parsed into yearly\n"," subsets with observation times where available. See the\n","\t\t /by_year/readme.txt and \n","\t\t /by_year/ghcn-daily-by_year-format.rtf \n","\t\t files for further information\n","grid:\t Directory with the GHCN-Daily gridded dataset known \n"," as HadGHCND\n","papers:\t\t Directory with pdf versions of journal articles relevant \n"," to the GHCN-Daily dataset\n","figures:\t Directory containing figures that summarize the inventory \n"," of GHCN-Daily station records\t\t \n","\n","ghcnd-all.tar.gz: TAR file of the GZIP-compressed files in the \"all\" directory\n","ghcnd-gsn.tar.gz: TAR file of the GZIP-compressed \"gsn\" directory\n","ghcnd-hcn.tar.gz: TAR file of the GZIP-compressed \"hcn\" directory\n","\n","ghcnd-countries.txt: List of country codes (FIPS) and names\n","ghcnd-inventory.txt: File listing the periods of record for each station and \n"," element\n","ghcnd-stations.txt: List of stations and their metadata (e.g., coordinates)\n","ghcnd-states.txt: List of U.S. state and Canadian Province codes \n"," used in ghcnd-stations.txt\n","ghcnd-version.txt: File that specifies the current version of GHCN Daily\n","\n","readme.txt: This file\n","status.txt: Notes on the current status of GHCN-Daily\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","III. FORMAT OF DATA FILES (\".dly\" FILES)\n","\n","Each \".dly\" file contains data for one station. The name of the file\n","corresponds to a station's identification code. For example, \"USC00026481.dly\"\n","contains the data for the station with the identification code USC00026481).\n","\n","Each record in a file contains one month of daily data. The variables on each\n","line include the following:\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","ID 1-11 Character\n","YEAR 12-15 Integer\n","MONTH 16-17 Integer\n","ELEMENT 18-21 Character\n","VALUE1 22-26 Integer\n","MFLAG1 27-27 Character\n","QFLAG1 28-28 Character\n","SFLAG1 29-29 Character\n","VALUE2 30-34 Integer\n","MFLAG2 35-35 Character\n","QFLAG2 36-36 Character\n","SFLAG2 37-37 Character\n"," . . .\n"," . . .\n"," . . .\n","VALUE31 262-266 Integer\n","MFLAG31 267-267 Character\n","QFLAG31 268-268 Character\n","SFLAG31 269-269 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Please see \"ghcnd-stations.txt\"\n"," for a complete list of stations and their metadata.\n","YEAR is the year of the record.\n","\n","MONTH is the month of the record.\n","\n","ELEMENT is the element type. There are five core elements as well as a number\n"," of addition elements. \n","\t \n","\t The five core elements are:\n","\n"," PRCP = Precipitation (tenths of mm)\n"," \t SNOW = Snowfall (mm)\n","\t SNWD = Snow depth (mm)\n"," TMAX = Maximum temperature (tenths of degrees C)\n"," TMIN = Minimum temperature (tenths of degrees C)\n","\t \n","\t The other elements are:\n","\t \n","\t ACMC = Average cloudiness midnight to midnight from 30-second \n","\t ceilometer data (percent)\n","\t ACMH = Average cloudiness midnight to midnight from \n","\t manual observations (percent)\n"," ACSC = Average cloudiness sunrise to sunset from 30-second \n","\t ceilometer data (percent)\n","\t ACSH = Average cloudiness sunrise to sunset from manual \n","\t observations (percent)\n"," AWDR = Average daily wind direction (degrees)\n","\t AWND = Average daily wind speed (tenths of meters per second)\n","\t DAEV = Number of days included in the multiday evaporation\n","\t total (MDEV)\n","\t DAPR = Number of days included in the multiday precipiation \n","\t total (MDPR)\n"," DASF = Number of days included in the multiday snowfall \n","\t total (MDSF)\t\t \n","\t DATN = Number of days included in the multiday minimum temperature \n","\t (MDTN)\n","\t DATX = Number of days included in the multiday maximum temperature \n","\t (MDTX)\n"," DAWM = Number of days included in the multiday wind movement\n","\t (MDWM)\n","\t DWPR = Number of days with non-zero precipitation included in \n","\t multiday precipitation total (MDPR)\n","\t EVAP = Evaporation of water from evaporation pan (tenths of mm)\n","\t FMTM = Time of fastest mile or fastest 1-minute wind \n","\t (hours and minutes, i.e., HHMM)\n","\t FRGB = Base of frozen ground layer (cm)\n","\t FRGT = Top of frozen ground layer (cm)\n","\t FRTH = Thickness of frozen ground layer (cm)\n","\t GAHT = Difference between river and gauge height (cm)\n","\t MDEV = Multiday evaporation total (tenths of mm; use with DAEV)\n","\t MDPR = Multiday precipitation total (tenths of mm; use with DAPR and \n","\t DWPR, if available)\n","\t MDSF = Multiday snowfall total \n","\t MDTN = Multiday minimum temperature (tenths of degrees C; use with \n","\t DATN)\n","\t MDTX = Multiday maximum temperature (tenths of degress C; use with \n","\t DATX)\n","\t MDWM = Multiday wind movement (km)\n"," MNPN = Daily minimum temperature of water in an evaporation pan \n","\t (tenths of degrees C)\n"," MXPN = Daily maximum temperature of water in an evaporation pan \n","\t (tenths of degrees C)\n","\t PGTM = Peak gust time (hours and minutes, i.e., HHMM)\n","\t PSUN = Daily percent of possible sunshine (percent)\n","\t SN*# = Minimum soil temperature (tenths of degrees C)\n","\t where * corresponds to a code\n","\t for ground cover and # corresponds to a code for soil \n","\t\t depth. \n","\t\t \n","\t\t Ground cover codes include the following:\n","\t\t 0 = unknown\n","\t\t 1 = grass\n","\t\t 2 = fallow\n","\t\t 3 = bare ground\n","\t\t 4 = brome grass\n","\t\t 5 = sod\n","\t\t 6 = straw multch\n","\t\t 7 = grass muck\n","\t\t 8 = bare muck\n","\t\t \n","\t\t Depth codes include the following:\n","\t\t 1 = 5 cm\n","\t\t 2 = 10 cm\n","\t\t 3 = 20 cm\n","\t\t 4 = 50 cm\n","\t\t 5 = 100 cm\n","\t\t 6 = 150 cm\n","\t\t 7 = 180 cm\n","\t\t \n","\t SX*# = Maximum soil temperature (tenths of degrees C) \n","\t where * corresponds to a code for ground cover \n","\t\t and # corresponds to a code for soil depth. \n","\t\t See SN*# for ground cover and depth codes. \n"," TAVG = Average temperature (tenths of degrees C)\n","\t [Note that TAVG from source 'S' corresponds\n","\t\t to an average for the period ending at\n","\t\t 2400 UTC rather than local midnight]\n"," THIC = Thickness of ice on water (tenths of mm)\t\n"," \t TOBS = Temperature at the time of observation (tenths of degrees C)\n","\t TSUN = Daily total sunshine (minutes)\n","\t WDF1 = Direction of fastest 1-minute wind (degrees)\n","\t WDF2 = Direction of fastest 2-minute wind (degrees)\n","\t WDF5 = Direction of fastest 5-second wind (degrees)\n","\t WDFG = Direction of peak wind gust (degrees)\n","\t WDFI = Direction of highest instantaneous wind (degrees)\n","\t WDFM = Fastest mile wind direction (degrees)\n"," WDMV = 24-hour wind movement (km)\t \n"," WESD = Water equivalent of snow on the ground (tenths of mm)\n","\t WESF = Water equivalent of snowfall (tenths of mm)\n","\t WSF1 = Fastest 1-minute wind speed (tenths of meters per second)\n","\t WSF2 = Fastest 2-minute wind speed (tenths of meters per second)\n","\t WSF5 = Fastest 5-second wind speed (tenths of meters per second)\n","\t WSFG = Peak gust wind speed (tenths of meters per second)\n","\t WSFI = Highest instantaneous wind speed (tenths of meters per second)\n","\t WSFM = Fastest mile wind speed (tenths of meters per second)\n","\t WT** = Weather Type where ** has one of the following values:\n","\t \n"," 01 = Fog, ice fog, or freezing fog (may include heavy fog)\n"," 02 = Heavy fog or heaving freezing fog (not always \n","\t\t distinquished from fog)\n"," 03 = Thunder\n"," 04 = Ice pellets, sleet, snow pellets, or small hail \n"," 05 = Hail (may include small hail)\n"," 06 = Glaze or rime \n"," 07 = Dust, volcanic ash, blowing dust, blowing sand, or \n","\t\t blowing obstruction\n"," 08 = Smoke or haze \n"," 09 = Blowing or drifting snow\n"," 10 = Tornado, waterspout, or funnel cloud \n"," 11 = High or damaging winds\n"," 12 = Blowing spray\n"," 13 = Mist\n"," 14 = Drizzle\n"," 15 = Freezing drizzle \n"," 16 = Rain (may include freezing rain, drizzle, and\n","\t\t freezing drizzle) \n"," 17 = Freezing rain \n"," 18 = Snow, snow pellets, snow grains, or ice crystals\n"," 19 = Unknown source of precipitation \n"," 21 = Ground fog \n"," 22 = Ice fog or freezing fog\n","\t\t \n"," WV** = Weather in the Vicinity where ** has one of the following \n","\t values:\n","\t\t \n","\t\t 01 = Fog, ice fog, or freezing fog (may include heavy fog)\n","\t\t 03 = Thunder\n","\t\t 07 = Ash, dust, sand, or other blowing obstruction\n","\t\t 18 = Snow or ice crystals\n","\t\t 20 = Rain or snow shower\n","\t\t \n","VALUE1 is the value on the first day of the month (missing = -9999).\n","\n","MFLAG1 is the measurement flag for the first day of the month. There are\n"," ten possible values:\n","\n"," Blank = no measurement information applicable\n"," B = precipitation total formed from two 12-hour totals\n"," D = precipitation total formed from four six-hour totals\n","\t H = represents highest or lowest hourly temperature (TMAX or TMIN) \n","\t or the average of hourly values (TAVG)\n","\t K = converted from knots \n","\t L = temperature appears to be lagged with respect to reported\n","\t hour of observation \n"," O = converted from oktas \n","\t P = identified as \"missing presumed zero\" in DSI 3200 and 3206\n"," T = trace of precipitation, snowfall, or snow depth\n","\t W = converted from 16-point WBAN code (for wind direction)\n","\n","QFLAG1 is the quality flag for the first day of the month. There are \n"," fourteen possible values:\n","\n"," Blank = did not fail any quality assurance check\n"," D = failed duplicate check\n"," G = failed gap check\n"," I = failed internal consistency check\n"," K = failed streak/frequent-value check\n","\t L = failed check on length of multiday period \n"," M = failed megaconsistency check\n"," N = failed naught check\n"," O = failed climatological outlier check\n"," R = failed lagged range check\n"," S = failed spatial consistency check\n"," T = failed temporal consistency check\n"," W = temperature too warm for snow\n"," X = failed bounds check\n","\t Z = flagged as a result of an official Datzilla \n","\t investigation\n","\n","SFLAG1 is the source flag for the first day of the month. There are \n"," twenty nine possible values (including blank, upper and \n","\t lower case letters):\n","\n"," Blank = No source (i.e., data value missing)\n"," 0 = U.S. Cooperative Summary of the Day (NCDC DSI-3200)\n"," 6 = CDMP Cooperative Summary of the Day (NCDC DSI-3206)\n"," 7 = U.S. Cooperative Summary of the Day -- Transmitted \n","\t via WxCoder3 (NCDC DSI-3207)\n"," A = U.S. Automated Surface Observing System (ASOS) \n"," real-time data (since January 1, 2006)\n","\t a = Australian data from the Australian Bureau of Meteorology\n"," B = U.S. ASOS data for October 2000-December 2005 (NCDC \n"," DSI-3211)\n","\t b = Belarus update\n","\t C = Environment Canada\n","\t E = European Climate Assessment and Dataset (Klein Tank \n","\t et al., 2002)\t \n"," F = U.S. Fort data \n"," G = Official Global Climate Observing System (GCOS) or \n"," other government-supplied data\n"," H = High Plains Regional Climate Center real-time data\n"," I = International collection (non U.S. data received through\n","\t personal contacts)\n"," K = U.S. Cooperative Summary of the Day data digitized from\n","\t paper observer forms (from 2011 to present)\n"," M = Monthly METAR Extract (additional ASOS data)\n","\t N = Community Collaborative Rain, Hail,and Snow (CoCoRaHS)\n","\t Q = Data from several African countries that had been \n","\t \"quarantined\", that is, withheld from public release\n","\t\t until permission was granted from the respective \n","\t meteorological services\n"," R = NCEI Reference Network Database (Climate Reference Network\n","\t and Regional Climate Reference Network)\n","\t r = All-Russian Research Institute of Hydrometeorological \n","\t Information-World Data Center\n"," S = Global Summary of the Day (NCDC DSI-9618)\n"," NOTE: \"S\" values are derived from hourly synoptic reports\n"," exchanged on the Global Telecommunications System (GTS).\n"," Daily values derived in this fashion may differ significantly\n"," from \"true\" daily data, particularly for precipitation\n"," (i.e., use with caution).\n","\t s = China Meteorological Administration/National Meteorological Information Center/\n","\t Climatic Data Center (http://cdc.cma.gov.cn)\n"," T = SNOwpack TELemtry (SNOTEL) data obtained from the U.S. \n","\t Department of Agriculture's Natural Resources Conservation Service\n","\t U = Remote Automatic Weather Station (RAWS) data obtained\n","\t from the Western Regional Climate Center\t \n","\t u = Ukraine update\t \n","\t W = WBAN/ASOS Summary of the Day from NCDC's Integrated \n","\t Surface Data (ISD). \n"," X = U.S. First-Order Summary of the Day (NCDC DSI-3210)\n","\t Z = Datzilla official additions or replacements \n","\t z = Uzbekistan update\n","\t \n","\t When data are available for the same time from more than one source,\n","\t the highest priority source is chosen according to the following\n","\t priority order (from highest to lowest):\n","\t Z,R,0,6,C,X,W,K,7,F,B,M,r,E,z,u,b,s,a,G,Q,I,A,N,T,U,H,S\n","\t \n","\t \n","VALUE2 is the value on the second day of the month\n","\n","MFLAG2 is the measurement flag for the second day of the month.\n","\n","QFLAG2 is the quality flag for the second day of the month.\n","\n","SFLAG2 is the source flag for the second day of the month.\n","\n","... and so on through the 31st day of the month. Note: If the month has less \n","than 31 days, then the remaining variables are set to missing (e.g., for April, \n","VALUE31 = -9999, MFLAG31 = blank, QFLAG31 = blank, SFLAG31 = blank).\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","IV. FORMAT OF \"ghcnd-stations.txt\"\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","GSN FLAG 73-75 Character\n","HCN/CRN FLAG 77-79 Character\n","WMO ID 81-85 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Note that the first two\n"," characters denote the FIPS country code, the third character \n"," is a network code that identifies the station numbering system \n"," used, and the remaining eight characters contain the actual \n"," station ID. \n","\n"," See \"ghcnd-countries.txt\" for a complete list of country codes.\n","\t See \"ghcnd-states.txt\" for a list of state/province/territory codes.\n","\n"," The network code has the following five values:\n","\n"," 0 = unspecified (station identified by up to eight \n","\t alphanumeric characters)\n","\t 1 = Community Collaborative Rain, Hail,and Snow (CoCoRaHS)\n","\t based identification number. To ensure consistency with\n","\t with GHCN Daily, all numbers in the original CoCoRaHS IDs\n","\t have been left-filled to make them all four digits long. \n","\t In addition, the characters \"-\" and \"_\" have been removed \n","\t to ensure that the IDs do not exceed 11 characters when \n","\t preceded by \"US1\". For example, the CoCoRaHS ID \n","\t \"AZ-MR-156\" becomes \"US1AZMR0156\" in GHCN-Daily\n"," C = U.S. Cooperative Network identification number (last six \n"," characters of the GHCN-Daily ID)\n","\t E = Identification number used in the ECA&D non-blended\n","\t dataset\n","\t M = World Meteorological Organization ID (last five\n","\t characters of the GHCN-Daily ID)\n","\t N = Identification number used in data supplied by a \n","\t National Meteorological or Hydrological Center\n","\t R = U.S. Interagency Remote Automatic Weather Station (RAWS)\n","\t identifier\n","\t S = U.S. Natural Resources Conservation Service SNOwpack\n","\t TELemtry (SNOTEL) station identifier\n"," W = WBAN identification number (last five characters of the \n"," GHCN-Daily ID)\n","\n","LATITUDE is latitude of the station (in decimal degrees).\n","\n","LONGITUDE is the longitude of the station (in decimal degrees).\n","\n","ELEVATION is the elevation of the station (in meters, missing = -999.9).\n","\n","\n","STATE is the U.S. postal code for the state (for U.S. stations only).\n","\n","NAME is the name of the station.\n","\n","GSN FLAG is a flag that indicates whether the station is part of the GCOS\n"," Surface Network (GSN). The flag is assigned by cross-referencing \n"," the number in the WMOID field with the official list of GSN \n"," stations. There are two possible values:\n","\n"," Blank = non-GSN station or WMO Station number not available\n"," GSN = GSN station \n","\n","HCN/ is a flag that indicates whether the station is part of the U.S.\n","CRN FLAG Historical Climatology Network (HCN). There are three possible \n"," values:\n","\n"," Blank = Not a member of the U.S. Historical Climatology \n","\t or U.S. Climate Reference Networks\n"," HCN = U.S. Historical Climatology Network station\n","\t CRN = U.S. Climate Reference Network or U.S. Regional Climate \n","\t Network Station\n","\n","WMO ID is the World Meteorological Organization (WMO) number for the\n"," station. If the station has no WMO number (or one has not yet \n","\t been matched to this station), then the field is blank.\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","V. FORMAT OF \"ghcnd-countries.txt\"\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","CODE 1-2 Character\n","NAME 4-50 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","CODE is the FIPS country code of the country where the station is \n"," located (from FIPS Publication 10-4 at \n"," www.cia.gov/cia/publications/factbook/appendix/appendix-d.html).\n","\n","NAME is the name of the country.\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","VI. FORMAT OF \"ghcnd-states.txt\"\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","CODE 1-2 Character\n","NAME 4-50 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","CODE is the POSTAL code of the U.S. state/territory or Canadian \n"," province where the station is located \n","\n","NAME is the name of the state, territory or province.\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","VII. FORMAT OF \"ghcnd-inventory.txt\"\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","ID 1-11 Character\n","LATITUDE 13-20 Real\n","LONGITUDE 22-30 Real\n","ELEMENT 32-35 Character\n","FIRSTYEAR 37-40 Integer\n","LASTYEAR 42-45 Integer\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Please see \"ghcnd-stations.txt\"\n"," for a complete list of stations and their metadata.\n","\n","LATITUDE is the latitude of the station (in decimal degrees).\n","\n","LONGITUDE is the longitude of the station (in decimal degrees).\n","\n","ELEMENT is the element type. See section III for a definition of elements.\n","\n","FIRSTYEAR is the first year of unflagged data for the given element.\n","\n","LASTYEAR is the last year of unflagged data for the given element.\n","\n","--------------------------------------------------------------------------------\n","--------------------------------------------------------------------------------\n","\n","VIII. REFERENCES\n","\n","Klein Tank, A.M.G. and Coauthors, 2002. Daily dataset of 20th-century surface\n","air temperature and precipitation series for the European Climate Assessment.\n","Int. J. of Climatol., 22, 1441-1453.\n","Data and metadata available at http://eca.knmi.nl\n","\n","\n","\n","For additional information, please send an e-mail to ncdc.ghcnd@noaa.gov.\n","\n"]}],"source": ["print(readme)"]},{"cell_type": "markdown","metadata": {},"source": ["In particular, we'll be interested in section II which lists the contents.\n","\n","```\n","II. CONTENTS OF ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily\n","\n","all: Directory with \".dly\" files for all of GHCN-Daily\n","gsn: Directory with \".dly\" files for the GCOS Surface Network \n"," (GSN)\n","hcn: Directory with \".dly\" files for U.S. HCN\n","by_year: Directory with GHCN Daily files parsed into yearly\n"," subsets with observation times where available. See the\n","\t\t /by_year/readme.txt and \n","\t\t /by_year/ghcn-daily-by_year-format.rtf \n","\t\t files for further information\n","grid:\t Directory with the GHCN-Daily gridded dataset known \n"," as HadGHCND\n","papers:\t\t Directory with pdf versions of journal articles relevant \n"," to the GHCN-Daily dataset\n","figures:\t Directory containing figures that summarize the inventory \n"," of GHCN-Daily station records\t\t \n","\n","ghcnd-all.tar.gz: TAR file of the GZIP-compressed files in the \"all\" directory\n","ghcnd-gsn.tar.gz: TAR file of the GZIP-compressed \"gsn\" directory\n","ghcnd-hcn.tar.gz: TAR file of the GZIP-compressed \"hcn\" directory\n","\n","ghcnd-countries.txt: List of country codes (FIPS) and names\n","ghcnd-inventory.txt: File listing the periods of record for each station and \n"," element\n","ghcnd-stations.txt: List of stations and their metadata (e.g., coordinates)\n","ghcnd-states.txt: List of U.S. state and Canadian Province codes \n"," used in ghcnd-stations.txt\n","ghcnd-version.txt: File that specifies the current version of GHCN Daily\n","\n","readme.txt: This file\n","status.txt: Notes on the current status of GHCN-Daily\n","```\n","\n","As we look at the files available we cansee that `ghcnd-inventory.txt` has a listing of the recording periods for each station which will help us find a good data set, and `ghcnd-stations.txt` lists the stations which should help us find the station closest to our location, so we'll grab those two files first."]},{"cell_type": "markdown","metadata": {},"source": ["```\n","II. CONTENTS OF ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily\n","\n","all: Directory with \".dly\" files for all of GHCN-Daily\n","gsn: Directory with \".dly\" files for the GCOS Surface Network \n"," (GSN)\n","hcn: Directory with \".dly\" files for U.S. HCN\n","by_year: Directory with GHCN Daily files parsed into yearly\n"," subsets with observation times where available. See the\n","\t\t /by_year/readme.txt and \n","\t\t /by_year/ghcn-daily-by_year-format.rtf \n","\t\t files for further information\n","grid:\t Directory with the GHCN-Daily gridded dataset known \n"," as HadGHCND\n","papers:\t\t Directory with pdf versions of journal articles relevant \n"," to the GHCN-Daily dataset\n","figures:\t Directory containing figures that summarize the inventory \n"," of GHCN-Daily station records\t\t \n","\n","ghcnd-all.tar.gz: TAR file of the GZIP-compressed files in the \"all\" directory\n","ghcnd-gsn.tar.gz: TAR file of the GZIP-compressed \"gsn\" directory\n","ghcnd-hcn.tar.gz: TAR file of the GZIP-compressed \"hcn\" directory\n","\n","ghcnd-countries.txt: List of country codes (FIPS) and names\n","ghcnd-inventory.txt: File listing the periods of record for each station and \n"," element\n","ghcnd-stations.txt: List of stations and their metadata (e.g., coordinates)\n","ghcnd-states.txt: List of U.S. state and Canadian Province codes \n"," used in ghcnd-stations.txt\n","ghcnd-version.txt: File that specifies the current version of GHCN Daily\n","\n","readme.txt: This file\n","status.txt: Notes on the current status of GHCN-Daily\n","```\n"]},{"cell_type": "code","execution_count": 12,"metadata": {},"outputs": [],"source": ["# get inventory and stations files\n","\n","r = requests.get('https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-inventory.txt')\n","inventory_txt = r.text\n","r = requests.get('https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt')\n","stations_txt = r.text"]},{"cell_type": "markdown","metadata": {},"source": ["Once we have those files, we can save them to our local disk, so that we won't need to download them again if we need to go back to the original data."]},{"cell_type": "code","execution_count": 13,"metadata": {},"outputs": [],"source": ["# save both the inventory and stations files to disk, in case we need them\n","\n","with open(\"inventory.txt\", \"w\") as inventory_file:\n"," inventory_file.write(inventory_txt)\n"," \n","with open(\"stations.txt\", \"w\") as stations_file:\n"," stations_file.write(stations_txt)\n"," "]},{"cell_type": "markdown","metadata": {},"source": ["We'll start by looking at the inventory file. Here's what the first 137 characters show us:"]},{"cell_type": "code","execution_count": 16,"metadata": {"scrolled": true},"outputs": [{"name": "stdout","output_type": "stream","text": ["ACW00011604 17.1167 -61.7833 TMAX 1949 1949\n","ACW00011604 17.1167 -61.7833 TMIN 1949 1949\n","ACW00011604 17.1167 -61.7833 PRCP 1949 1949\n"]}],"source": ["print(inventory_txt[:137])"]},{"cell_type": "markdown","metadata": {},"source": ["If we look at section VII of the `readme.txt` file we can see that the format of the inventory file is:\n","```\n","VII. FORMAT OF \"ghcnd-inventory.txt\"\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","ID 1-11 Character\n","LATITUDE 13-20 Real\n","LONGITUDE 22-30 Real\n","ELEMENT 32-35 Character\n","FIRSTYEAR 37-40 Integer\n","LASTYEAR 42-45 Integer\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Please see \"ghcnd-stations.txt\"\n"," for a complete list of stations and their metadata.\n","\n","LATITUDE is the latitude of the station (in decimal degrees).\n","\n","LONGITUDE is the longitude of the station (in decimal degrees).\n","\n","ELEMENT is the element type. See section III for a definition of elements.\n","\n","FIRSTYEAR is the first year of unflagged data for the given element.\n","\n","LASTYEAR is the last year of unflagged data for the given element.\n","```\n","\n","From this descrption we can tell that inventory list has most of the information we need to find out what station we'll want to look at. We can use the latitude and longitude to find the stations closest to us, and then we can use the first and years years to a station with records covering a long span of time.\n","\n","The only question this file leaves us with is what the \"ELEMENT\" field is, for that it suggests we look at section III. In section III (which we'll look at in more detail later) we find the following description of the main elements:\n","\n","```\n","ELEMENT is the element type. There are five core elements as well as a number\n"," of addition elements. \n","\t \n","\t The five core elements are:\n","\n"," PRCP = Precipitation (tenths of mm)\n"," SNOW = Snowfall (mm)\n"," SNWD = Snow depth (mm)\n"," TMAX = Maximum temperature (tenths of degrees C)\n"," TMIN = Minimum temperature (tenths of degrees C)\n","```\n","\n","For our purpose we'll be interested in the TMAX and TMIN elements, which are maximum and minimum temperatures in tenths of degrees Centigrade."]},{"cell_type": "markdown","metadata": {},"source": ["### Parsing the inventory data\n","\n","The `readme.txt` file tells us what we've got in the inventory file, so we can parse the data into a more usable format. We could just store the parsed inventory data as a list of lists or list of tuples, but it takes only a little more effort to use namedtuple from the collections library to create a custom class with the attributes named. "]},{"cell_type": "code","execution_count": 20,"metadata": {},"outputs": [],"source": ["# parse to named tuples\n","\n","# use namedtuple to create a custom Inventory class\n","from collections import namedtuple\n","Inventory = namedtuple(\"Inventory\", ['station', 'latitude', 'longitude', 'element', 'start', 'end'])"]},{"cell_type": "markdown","metadata": {},"source": ["Using the Inventory class we created is very straightforward - we simply need to create each instance from the appropriate values, in this case a parsed row of inventory data. \n","\n","The parsing will involve two steps. First, we need to pick out slices of a line according to the field sizes specified. As you look at the field descriptions in the readme file, it's also clear that there is an extra space between files, which would need to be considered in coming up with any approach to parsing. In our case, since we're specifying each slice, the extra spaces are ignored. In addition, since the sizes of the station and element fields exactly correspond to the values stored in them we shouldn't need to worry about stripping excess spaces from them. \n","\n","The second thing that would be nice to do is to convert the latitude and longitude values to floats and the start and end years to ints. We could do this at later stage of data cleaning, and in fact if the data is inconsistent and doesn't have values that will convert correctly in every row, we might want to wait. But in this case the data will let us handle these conversions in the parsing step, so let's do it."]},{"cell_type": "code","execution_count": 21,"metadata": {},"outputs": [{"name": "stdout","output_type": "stream","text": ["Inventory(station='US009052008', latitude=43.7333, longitude=-96.6333, element='TMAX', start=2008, end=2016)\n","Inventory(station='US009052008', latitude=43.7333, longitude=-96.6333, element='TMIN', start=2008, end=2016)\n","Inventory(station='US009052008', latitude=43.7333, longitude=-96.6333, element='PRCP', start=2008, end=2016)\n","Inventory(station='US009052008', latitude=43.7333, longitude=-96.6333, element='SNWD', start=2009, end=2016)\n","Inventory(station='US10RMHS145', latitude=40.5268, longitude=-105.1113, element='PRCP', start=2004, end=2004)\n"]}],"source": ["# parse inventory lines and convert some values to floats and ints\n","\n","inventory = [Inventory(x[0:11], float(x[12:20]), float(x[21:30]), x[31:35], int(x[36:40]), int(x[41:45])) \n"," for x in inventory_txt.split(\"\\n\") if x.startswith(\"US\")]\n","\n","for line in inventory[:5]:\n"," print(line)"]},{"cell_type": "markdown","metadata": {},"source": ["### Selecting a station based on latitude and longitude\n","\n","Now that the inventory is loaded we can use the latitude and longitude to find the stations closest to our location and then pick the one with the longest run of temperatures base on start and end years. As we look at even the first line of the data, we can see two things to worry about. First, there are various different element types, but we're only concerned with TMIN and TMAX, for min and max temeprature. Second, none of the first inventory entries we see cover more than a few years. If we're going to be looking for a historical perspectinve, we'll want to find a much longer run of temperature data.\n","\n","To do pick out what we need quickly we can use a list comprehension to make a sub list of only the station inventory items where the element is either TMIN or TMAX. The other thing that we care about is getting a station with a long run of data so while we're creating this sub list, let's also make sure that the start year is before 1920 and the end year is at least 2015. That way we'll only be looking at stations with at least 95 years of data."]},{"cell_type": "code","execution_count": 22,"metadata": {},"outputs": [{"data": {"text/plain": ["[Inventory(station='USC00010252', latitude=31.3072, longitude=-86.5225, element='TMAX', start=1912, end=2017),\n"," Inventory(station='USC00010252', latitude=31.3072, longitude=-86.5225, element='TMIN', start=1912, end=2017),\n"," Inventory(station='USC00010583', latitude=30.8839, longitude=-87.7853, element='TMAX', start=1915, end=2017),\n"," Inventory(station='USC00010583', latitude=30.8839, longitude=-87.7853, element='TMIN', start=1915, end=2017),\n"," Inventory(station='USC00012758', latitude=31.445, longitude=-86.9533, element='TMAX', start=1890, end=2017)]"]},"execution_count": 22,"metadata": {},"output_type": "execute_result"}],"source": ["inventory_temps = [x for x in inventory if x.element in ['TMIN', 'TMAX'] \n"," and x.end >= 2015 and x.start < 1920]\n","inventory_temps[:5]"]},{"cell_type": "markdown","metadata": {},"source": ["Looking at the first five records in our new list, we're in better shape. We now have only temperature records, and the start and end years show we have longer runs. \n","\n","That leaves the problem of selecting the station nearest to our location. To do that we'll want to compare the latitude and longitude of the station inventories to that of our location. There are various ways to get the latitude and longitude of any place but probably the easiest is to use an online mapping application or online search. When I do that for the Chicago Loop, I get a latitude of 41.882 and a longitude of -87.629.\n","\n","Since we're interested in the stations closest to our location, that implies sorting based on how close the latitude and longitude of the stations are to that of our location. Sorting a list is easy enough, and sorting by latitude and longitude is not that hard, but the question is how do we sort by the distance from our latitude and longitude?\n","\n","The answer is to define a key funtion for our sort that gets the difference between our latitude and the station latitude, and the difference between our longitude and the station longitude and combines them into one number. The only other thing to remember is that we'll want to add the absolute value of the differences before we combine them to avoid having a high negative difference combined with an equally high positive difference fool our sort."]},{"cell_type": "code","execution_count": 24,"metadata": {"scrolled": true},"outputs": [{"data": {"text/plain": ["[Inventory(station='USC00110338', latitude=41.7806, longitude=-88.3092, element='TMAX', start=1893, end=2017),\n"," Inventory(station='USC00110338', latitude=41.7806, longitude=-88.3092, element='TMIN', start=1893, end=2017),\n"," Inventory(station='USC00112736', latitude=42.0628, longitude=-88.2861, element='TMAX', start=1897, end=2017),\n"," Inventory(station='USC00112736', latitude=42.0628, longitude=-88.2861, element='TMIN', start=1897, end=2017),\n"," Inventory(station='USC00476922', latitude=42.7022, longitude=-87.7861, element='TMAX', start=1896, end=2017),\n"," Inventory(station='USC00476922', latitude=42.7022, longitude=-87.7861, element='TMIN', start=1896, end=2017),\n"," Inventory(station='USC00124837', latitude=41.6117, longitude=-86.7297, element='TMAX', start=1897, end=2017),\n"," Inventory(station='USC00124837', latitude=41.6117, longitude=-86.7297, element='TMIN', start=1897, end=2017),\n"," Inventory(station='USC00119021', latitude=40.7928, longitude=-87.7556, element='TMAX', start=1893, end=2017),\n"," Inventory(station='USC00119021', latitude=40.7928, longitude=-87.7556, element='TMIN', start=1894, end=2017),\n"," Inventory(station='USC00115825', latitude=41.3708, longitude=-88.4336, element='TMAX', start=1912, end=2017),\n"," Inventory(station='USC00115825', latitude=41.3708, longitude=-88.4336, element='TMIN', start=1912, end=2017),\n"," Inventory(station='USC00115326', latitude=42.2636, longitude=-88.6078, element='TMAX', start=1893, end=2017),\n"," Inventory(station='USC00115326', latitude=42.2636, longitude=-88.6078, element='TMIN', start=1893, end=2017),\n"," Inventory(station='USC00200710', latitude=42.1244, longitude=-86.4267, element='TMAX', start=1893, end=2017),\n"," Inventory(station='USC00200710', latitude=42.1244, longitude=-86.4267, element='TMIN', start=1893, end=2017),\n"," Inventory(station='USC00114198', latitude=40.4664, longitude=-87.685, element='TMAX', start=1902, end=2017),\n"," Inventory(station='USC00114198', latitude=40.4664, longitude=-87.685, element='TMIN', start=1902, end=2017),\n"," Inventory(station='USW00014848', latitude=41.7072, longitude=-86.3164, element='TMAX', start=1893, end=2017),\n"," Inventory(station='USW00014848', latitude=41.7072, longitude=-86.3164, element='TMIN', start=1893, end=2017)]"]},"execution_count": 24,"metadata": {},"output_type": "execute_result"}],"source": ["# Downtown Chicago, obtained via online map\n","latitude, longitude = 41.882, -87.629\n","\n","inventory_temps.sort(key=lambda x: abs(latitude-x.latitude) + abs(longitude-x.longitude))\n","\n","inventory_temps[:20]"]},{"cell_type": "markdown","metadata": {},"source": ["### Selecting a station and getting the station metadata\n","\n","As we look at the top 20 entries in our newly sorted list it seems that the first station, USC00110338, is a good fit. It's got both TMIN and TMAX and one of the longer series, starting in 1893 and running up through 2017, for over 120 years of data. So we'll save that station into our station variable and quickly parse the station data we've already grabbed to pick up a little more information about the station.\n","\n","Back in the readme file we find the following information about the station data:\n","\n","```\n","IV. FORMAT OF \"ghcnd-stations.txt\"\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","GSN FLAG 73-75 Character\n","HCN/CRN FLAG 77-79 Character\n","WMO ID 81-85 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Note that the first two\n"," characters denote the FIPS country code, the third character \n"," is a network code that identifies the station numbering system \n"," used, and the remaining eight characters contain the actual \n"," station ID. \n","\n"," See \"ghcnd-countries.txt\" for a complete list of country codes.\n","\t See \"ghcnd-states.txt\" for a list of state/province/territory codes.\n","\n"," The network code has the following five values:\n","\n"," 0 = unspecified (station identified by up to eight \n","\t alphanumeric characters)\n","\t 1 = Community Collaborative Rain, Hail,and Snow (CoCoRaHS)\n","\t based identification number. To ensure consistency with\n","\t with GHCN Daily, all numbers in the original CoCoRaHS IDs\n","\t have been left-filled to make them all four digits long. \n","\t In addition, the characters \"-\" and \"_\" have been removed \n","\t to ensure that the IDs do not exceed 11 characters when \n","\t preceded by \"US1\". For example, the CoCoRaHS ID \n","\t \"AZ-MR-156\" becomes \"US1AZMR0156\" in GHCN-Daily\n"," C = U.S. Cooperative Network identification number (last six \n"," characters of the GHCN-Daily ID)\n","\t E = Identification number used in the ECA&D non-blended\n","\t dataset\n","\t M = World Meteorological Organization ID (last five\n","\t characters of the GHCN-Daily ID)\n","\t N = Identification number used in data supplied by a \n","\t National Meteorological or Hydrological Center\n","\t R = U.S. Interagency Remote Automatic Weather Station (RAWS)\n","\t identifier\n","\t S = U.S. Natural Resources Conservation Service SNOwpack\n","\t TELemtry (SNOTEL) station identifier\n"," W = WBAN identification number (last five characters of the \n"," GHCN-Daily ID)\n","\n","LATITUDE is latitude of the station (in decimal degrees).\n","\n","LONGITUDE is the longitude of the station (in decimal degrees).\n","\n","ELEVATION is the elevation of the station (in meters, missing = -999.9).\n","\n","\n","STATE is the U.S. postal code for the state (for U.S. stations only).\n","\n","NAME is the name of the station.\n","\n","GSN FLAG is a flag that indicates whether the station is part of the GCOS\n"," Surface Network (GSN). The flag is assigned by cross-referencing \n"," the number in the WMOID field with the official list of GSN \n"," stations. There are two possible values:\n","\n"," Blank = non-GSN station or WMO Station number not available\n"," GSN = GSN station \n","\n","HCN/ is a flag that indicates whether the station is part of the U.S.\n","CRN FLAG Historical Climatology Network (HCN). There are three possible \n"," values:\n","\n"," Blank = Not a member of the U.S. Historical Climatology \n","\t or U.S. Climate Reference Networks\n"," HCN = U.S. Historical Climatology Network station\n","\t CRN = U.S. Climate Reference Network or U.S. Regional Climate \n","\t Network Station\n","\n","WMO ID is the World Meteorological Organization (WMO) number for the\n"," station. If the station has no WMO number (or one has not yet \n","\t been matched to this station), then the field is blank.\n","```\n","\n","While I might care more about the metadata fields for more serious research, for my purpose right now, I want to the start and end year from the inventory records to the rest of the station metadata in the station file.\n","\n","There are a number of ways I could sift through the stations file to find the one station that matches the station ID I selected above. I could create a for loop to go through each line and break out when I found it, I could split the data into lines, and the sort and use a binary search, and so on. And depending on the nature and amount of data one approach or another might be appropriate. In this case, since I have the data loaded already and it's not too large, my preference would be to use a list comprehension to return a list with it's one element being the station I'm looking for. "]},{"cell_type": "code","execution_count": 38,"metadata": {},"outputs": [{"name": "stdout","output_type": "stream","text": ["Station(station_id='USC00110338', latitude=41.7806, longitude=-88.3092, elevation=201.2, state='IL', name='AURORA', start=1893, end=2017)\n"]}],"source": ["station_id = 'USC00110338'\n","\n","# parse stations\n","Station = namedtuple(\"Station\", ['station_id', 'latitude', 'longitude', 'elevation', 'state', 'name', 'start', 'end'])\n","\n","stations = [(x[0:11], float(x[12:20]), float(x[21:30]), float(x[31:37]), x[38:40].strip(), x[41:71].strip())\n"," for x in stations_txt.split(\"\\n\") if x.startswith(station_id)]\n","\n","station = Station(*stations[0] + (inventory_temps[0].start, inventory_temps[0].end))\n","print(station)\n"]},{"cell_type": "markdown","metadata": {},"source": ["At this point I've identified that I want weather data from the station at Aurora Illinois, which is the nearest station to downtown Chicago with over a century of temperature data."]},{"cell_type": "markdown","metadata": {},"source": ["## Fetching and parsing the actual weather data\n","\n","With the station identified, the next step is to fetch the actualy weather data for that station and parse it. The process will be quite similar to what we did above.\n","\n","### Fetching the data\n","\n","First, let's fetch the data file and save it, in case we need to go back to it. "]},{"cell_type": "code","execution_count": 39,"metadata": {},"outputs": [],"source": ["# fetch daily records for selected station\n","\n","r = requests.get('https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/all/{}.dly'.format(station.station_id))\n","weather = r.text\n","\n","# save into a text file, so we won't need to fetch again\n","\n","with open('weather_{}.txt'.format(station), \"w\") as weather_file:\n"," weather_file.write(weather)"]},{"cell_type": "code","execution_count": 8,"metadata": {},"outputs": [],"source": ["# read from saved daily file if needed (only used if we want to start the process over without downloadng the file)\n","\n","with open('weather_{}.txt'.format(station)) as weather_file:\n"," weather = weather_file.read()"]},{"cell_type": "code","execution_count": 45,"metadata": {"scrolled": true},"outputs": [{"name": "stdout","output_type": "stream","text": ["USC00110338189301TMAX -11 6 -44 6 -139 6 -83 6 -100 6 -83 6 -72 6 -83 6 -33 6 -178 6 -150 6 -128 6 -172 6 -200 6 -189 6 -150 6 -106 6 -61 6 -94 6 -33 6 -33 6 -33 6 -33 6 6 6 -33 6 -78 6 -33 6 44 6 -89 I6 -22 6 6 6\n","USC00110338189301TMIN -50 6 -139 6 -250 6 -144 6 -178 6 -228 6 -144 6 -222 6 -178 6 -250 6 -200 6 -206 6 -267 6 -272 6 -294 6 -294 6 -311 6 -200 6 -233 6 -178 6 -156 6 -89 6 -200 6 -194 6 -194 6 -178 6 -200 6 -33 I6 -156 6 -139 6 -167 6\n","\n"]}],"source": ["print(weather[:540])"]},{"cell_type": "markdown","metadata": {},"source": ["### Parsing the weather data\n","\n","Again, now that we have the data we can see it's quite a bit more complex that the station and inventory data. Clearly it's time to head back to the `readme.txt` file, and section III, which is the description of a weather data file. There are a lot of options, so we'll filter them down to the ones that concern us, and leave out the other element types as well as the whole system of flags specifying the source, quality, type of the values.\n","\n","```\n","III. FORMAT OF DATA FILES (\".dly\" FILES)\n","\n","Each \".dly\" file contains data for one station. The name of the file\n","corresponds to a station's identification code. For example, \"USC00026481.dly\"\n","contains the data for the station with the identification code USC00026481).\n","\n","Each record in a file contains one month of daily data. The variables on each\n","line include the following:\n","\n","------------------------------\n","Variable Columns Type\n","------------------------------\n","ID 1-11 Character\n","YEAR 12-15 Integer\n","MONTH 16-17 Integer\n","ELEMENT 18-21 Character\n","VALUE1 22-26 Integer\n","MFLAG1 27-27 Character\n","QFLAG1 28-28 Character\n","SFLAG1 29-29 Character\n","VALUE2 30-34 Integer\n","MFLAG2 35-35 Character\n","QFLAG2 36-36 Character\n","SFLAG2 37-37 Character\n"," . . .\n"," . . .\n"," . . .\n","VALUE31 262-266 Integer\n","MFLAG31 267-267 Character\n","QFLAG31 268-268 Character\n","SFLAG31 269-269 Character\n","------------------------------\n","\n","These variables have the following definitions:\n","\n","ID is the station identification code. Please see \"ghcnd-stations.txt\"\n"," for a complete list of stations and their metadata.\n","YEAR is the year of the record.\n","\n","MONTH is the month of the record.\n","\n","ELEMENT is the element type. There are five core elements as well as a number\n"," of addition elements. \n","\t \n","\t The five core elements are:\n","\n"," PRCP = Precipitation (tenths of mm)\n"," SNOW = Snowfall (mm)\n"," SNWD = Snow depth (mm)\n"," TMAX = Maximum temperature (tenths of degrees C)\n"," TMIN = Minimum temperature (tenths of degrees C)\n","\t \n","...\n","\t\t \n","VALUE1 is the value on the first day of the month (missing = -9999).\n","\n","MFLAG1 is the measurement flag for the first day of the month.\n","\n","QFLAG1 is the quality flag for the first day of the month.\n","\n","SFLAG1 is the source flag for the first day of the month.\n","\t \n","VALUE2 is the value on the second day of the month\n","\n","MFLAG2 is the measurement flag for the second day of the month.\n","\n","QFLAG2 is the quality flag for the second day of the month.\n","\n","SFLAG2 is the source flag for the second day of the month.\n","\n","... and so on through the 31st day of the month. Note: If the month has less \n","than 31 days, then the remaining variables are set to missing (e.g., for April, \n","VALUE31 = -9999, MFLAG31 = blank, QFLAG31 = blank, SFLAG31 = blank).\n","```\n","\n","The key points we care about right now are that the station ID is the 11 characters of a row, the year is the next 4, the month the next two, and the element the next 4 after that. After that there are 31 slots for daily data, with each slot consisting of 5 characters for the temperature, expressed in tenths of a degree centigrade, and 3 characters of flags. As mentioned earlier, we can disregard the flags for this exercise. We can also see that missing values for the temperatures are coded with -9999 if the that day is not in the month, so for a typical February, for example, the 29th, 30th, and 31st values would be -9999. \n","\n","As we process our data in this exercise we're looking to get overall trends, so we don't need to worry much about individual day so we can instead find average values for the month. We can instead save the maximum, minimum and mean values for the entire month and use those. \n","\n","This means that to process each line of weather data we need to do several things. We need to split the line into its separate fields abd we need to ignore or discard the flags for each daily value. We also need toremove the values with -9999, convert the year and month into ints and the temperature values into floats, keeping in mind that the temperature readings are in tenths of degrees centigrade. Finally we need to calculate the average value as well as picking out the high and low values. \n","\n","To accomplish all of this we can take a couple of approaches. One would be to do several passes over the data, splitting into fields, discarding the placeholders, converting strings to numbers, and finally calculating the summary values. Or we can write a function that performs all of these operatons on a single line, and do everything in one pass. Both can be valid approaches, and in this case we'll take the latter approach and create a function `parse_line` do perform all of our data transformations."]},{"cell_type": "code","execution_count": 114,"metadata": {},"outputs": [],"source": ["def parse_line(line):\n"," \"\"\" parses line of weather data\n"," removes values of -9999 (missing value)\n"," \"\"\"\n"," \n"," # return None if line is empty\n"," if not line:\n"," return None\n"," \n"," # split out first 4 fields and string containing temperature values\n"," record, temperature_string = (line[:11], int(line[11:15]), int(line[15:17]), line[17:21]), line[21:] \n"," \n"," # raise exception if the temperature string is too short\n"," if len(temperature_string) < 248:\n"," raise ValueError(\"String not long enough - {} {}\".format(temperature_string, str(line)))\n"," \n"," # use a list comprehension on the temperature_string to extract and convert the \n"," values = [float(temperature_string[i:i + 5])/10 for i in range(0, 248, 8)\n"," if not temperature_string[i:i + 5].startswith(\"-9999\")]\n"," \n"," # get the number of values, the max and min, and calculate average\n"," count = len(values)\n"," tmax = round(max(values), 1)\n"," tmin = round(min(values), 1)\n"," mean = round(sum(values)/count, 1)\n","\n"," # add the temperature summary values to the record fields extracted earlier and return\n"," return record + (tmax, tmin, mean, count)"]},{"cell_type": "markdown","metadata": {},"source": ["If we test this function with the first line of our raw weather data, we get the following result:"]},{"cell_type": "code","execution_count": 115,"metadata": {},"outputs": [{"data": {"text/plain": ["('USC00110338', 1893, 1, 'TMAX', 4.4, -20.0, -7.8, 31)"]},"execution_count": 115,"metadata": {},"output_type": "execute_result"}],"source": ["parse_line(weather[:270])"]},{"cell_type": "markdown","metadata": {},"source": ["So it looks like we have a function that will work to parse our data. If that works then we can parse the weather data and either store it or continue on with our processing."]},{"cell_type": "code","execution_count": 116,"metadata": {"scrolled": true},"outputs": [{"data": {"text/plain": ["[('USC00110338', 1893, 1, 'TMAX', 4.4, -20.0, -7.8, 31),\n"," ('USC00110338', 1893, 1, 'TMIN', -3.3, -31.1, -19.2, 31),\n"," ('USC00110338', 1893, 1, 'PRCP', 8.9, 0.0, 1.1, 31),\n"," ('USC00110338', 1893, 1, 'SNOW', 10.2, 0.0, 1.0, 31),\n"," ('USC00110338', 1893, 1, 'WT16', 0.1, 0.1, 0.1, 2),\n"," ('USC00110338', 1893, 1, 'WT18', 0.1, 0.1, 0.1, 11),\n"," ('USC00110338', 1893, 2, 'TMAX', 5.6, -17.2, -0.9, 27),\n"," ('USC00110338', 1893, 2, 'TMIN', 0.6, -26.1, -11.7, 27),\n"," ('USC00110338', 1893, 2, 'PRCP', 15.0, 0.0, 2.0, 28),\n"," ('USC00110338', 1893, 2, 'SNOW', 12.7, 0.0, 0.6, 28)]"]},"execution_count": 116,"metadata": {},"output_type": "execute_result"}],"source": ["# process all weather data\n","\n","# list comprehension, will not parse empty lines\n","weather_data = [parse_line(x) for x in weather.split(\"\\n\") if x]\n","\n","len(weather_data)\n","\n","weather_data[:10]"]},{"cell_type": "markdown","metadata": {},"source": ["We now have all the weather records, not just the temperature records, parsed and in our list. "]},{"cell_type": "markdown","metadata": {},"source": ["### Saving the weather data in a database (Optional)\n","\n","At this point we can save all of the weather records (and the station records and inventory records as well, if we want) into a database. This would let us come back in later sessions and use the same data without having to go the hassle of fetching and parsing the data again. \n","\n","As an example, the code below would be how we could save the weather data into a SQLite3 database."]},{"cell_type": "code","execution_count": 117,"metadata": {},"outputs": [],"source": ["import sqlite3\n","\n","conn = sqlite3.connect(\"weather_data.db\")\n","cursor = conn.cursor()"]},{"cell_type": "code","execution_count": 118,"metadata": {},"outputs": [],"source": ["# create weather table\n","\n","create_weather = \"\"\"CREATE TABLE \"weather\" (\n"," \"id\" text NOT NULL,\n"," \"year\" integer NOT NULL,\n"," \"month\" integer NOT NULL,\n"," \"element\" text NOT NULL,\n"," \"max\" real,\n"," \"min\" real,\n"," \"mean\" real,\n"," \"count\" integer)\"\"\"\n","cursor.execute(create_weather)\n","conn.commit()"]},{"cell_type": "code","execution_count": 119,"metadata": {"scrolled": true},"outputs": [],"source": ["# store parsed weather data in database\n","\n","for record in weather_data:\n"," cursor.execute(\"\"\"insert into weather (id, year, month, element, max, min, mean, count) values (?,?,?,?,?,?,?,?) \"\"\", \n"," record)\n","\n","conn.commit()"]},{"cell_type": "markdown","metadata": {},"source": ["Once we have the data stored we could retreive it from the database with code like the below, which fetches only the TMAX records."]},{"cell_type": "code","execution_count": 120,"metadata": {},"outputs": [{"data": {"text/plain": ["[('USC00110338', 1893, 1, 'TMAX', 4.4, -20.0, -7.8, 31),\n"," ('USC00110338', 1893, 2, 'TMAX', 5.6, -17.2, -0.9, 27),\n"," ('USC00110338', 1893, 3, 'TMAX', 20.6, -7.2, 5.6, 30),\n"," ('USC00110338', 1893, 4, 'TMAX', 28.9, 3.3, 13.5, 30),\n"," ('USC00110338', 1893, 5, 'TMAX', 30.6, 7.2, 19.2, 31)]"]},"execution_count": 120,"metadata": {},"output_type": "execute_result"}],"source": ["cursor.execute(\"\"\"select * from weather where element='TMAX' order by year, month\"\"\")\n","tmax_data = cursor.fetchall()\n","tmax_data[:5]"]},{"cell_type": "markdown","metadata": {},"source": ["### Selecting and graphing data\n","\n","Since we're only concerned with temperature we need to select just the temperature records. We can do that quickly enough by just usign a couple of list comprehensions to pick out a list for TMAX and one for TMIN. Or we could use the features of pandas, which we'll be using for graphing the date, to filter out the records we don't want. Since were more concerned with pure Python than pandas, we'll take the first approach."]},{"cell_type": "code","execution_count": 121,"metadata": {},"outputs": [{"data": {"text/plain": ["[('USC00110338', 1893, 1, 'TMIN', -3.3, -31.1, -19.2, 31),\n"," ('USC00110338', 1893, 2, 'TMIN', 0.6, -26.1, -11.7, 27),\n"," ('USC00110338', 1893, 3, 'TMIN', 3.3, -13.3, -4.6, 31),\n"," ('USC00110338', 1893, 4, 'TMIN', 12.2, -5.6, 2.2, 30),\n"," ('USC00110338', 1893, 5, 'TMIN', 14.4, -0.6, 5.7, 31)]"]},"execution_count": 121,"metadata": {},"output_type": "execute_result"}],"source": ["tmax_data = [x for x in weather_data if x[3] == 'TMAX']\n","tmin_data = [x for x in weather_data if x[3] == 'TMIN']\n","tmin_data[:5]"]},{"cell_type": "markdown","metadata": {},"source": ["#### Using pandas to graph our data\n","\n","At this point we have our data cleaned and ready to graph. To make the graphing easier we can use pandas and matplotlib as described in chapter 24. In order to do this we need to have a Jupyter server running and have pandas and matplotlib installed. We can make sure that they are installed from within our Jupyter notebook by using the following command:"]},{"cell_type": "code","execution_count": null,"metadata": {},"outputs": [],"source": ["# Install pandas and matplotlib using pip\n","! pip3.6 install pandas matplotlib"]},{"cell_type": "code","execution_count": 86,"metadata": {},"outputs": [],"source": ["import pandas as pd\n","%matplotlib inline"]},{"cell_type": "markdown","metadata": {},"source": ["Once pandas and matplotlib are installed we can load pandas and create data frames for our TMAX and TMIN data."]},{"cell_type": "code","execution_count": 124,"metadata": {},"outputs": [],"source": ["tmax_df = pd.DataFrame(tmax_data, columns=['Station', 'Year', 'Month', 'Element', 'Max', 'Min', 'Mean', 'Days'])\n","tmin_df = pd.DataFrame(tmin_data, columns=['Station', 'Year', 'Month', 'Element', 'Max', 'Min', 'Mean', 'Days'])"]},{"cell_type": "markdown","metadata": {},"source": ["We could plot the monthly values, but the 123 years times 12 months of data is almost 1500 data points, and the cycle of seasons also makes picking out patterns difficult. \n","\n","Instead, it would probably make more sense to average the high, low, and mean monthly values into yearly values and plot those. We could do this in python, but since we already have our data loaded in a pandas data frame we can use that to group by year and give us the mean values."]},{"cell_type": "code","execution_count": 133,"metadata": {"scrolled": true},"outputs": [{"data": {"text/plain": ["<matplotlib.axes._subplots.AxesSubplot at 0x7fac91a3ed30>"]},"execution_count": 133,"metadata": {},"output_type": "execute_result"},{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6oAAAEKCAYAAAAb/6jZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XdYVEfbB+DfUhTEimDvDcvSVARU\nsIsFe8ESNSbW2Luxm0TF3mKMsS0ICooQESuCCoKAiAhIkya9N+ns7vP94QevSNuFXSE693V5vW/O\nnpkzu+yeM+WZGQ4RgWEYhmEYhmEYhmHqC5m6LgDDMAzDMAzDMAzDfI41VBmGYRiGYRiGYZh6hTVU\nGYZhGIZhGIZhmHqFNVQZhmEYhmEYhmGYeoU1VBmGYRiGYRiGYZh6hTVUGYZhGIZhGIZhmHqFNVQZ\nhmEYhmEYhmGYeoU1VBmGYRiGYRiGYZh6hTVUGYZhGIZhGIZhmHpFrq4L8DkVFRXq0qVLXReDYRiG\nYRiGYRiGkYLXr1+nEpFqdefVq4Zqly5d4O3tXdfFYBiGYRiGYRiGYaSAw+F8EOU8FvrLMAzDMAzD\nMAzD1CusocowDMMwDMMwDMPUK6yhyjAMwzAMwzAMw9QrrKHKMAzDMAzDMAzD1CusocowDMMwDMMw\nDMPUK6yhyjAMwzAMwzAMw9QrrKHKMAzDMAzDMAzD1CusocowDMMwDMMwzH+Sb7IvfJN967oYjBTI\n1XUBGIZhGIZhGIZhamL/y/3IKszCo5mPIC8jX9fFYSSIjagyDMMwDMMwDPOfk1OUg/DMcKTkp8A5\n2rmui8NIGGuoMsx/iNMHJ0RnR9d1MRiGYRiGYercu7R3IBDkOHKwCraq6+IwEsYaqgzzHxGfE48N\nzzZgt9tuEFFdF4dhGIZhGKYMgVCAAn7BV7uef6o/AGBRv0XwTvJGWEbYV7s2I30SaahyOJwrHA4n\nmcPhBHx2bB+Hw4njcDi+//9vgiSuxTDfq9vvb4NA8En2gWeiZ10Xh6kjecV5uBt+l3VWMAzDMPXO\nP/7/YPK/kyEk4Ve53tuUt+jStAsW9VuEBjINYBXCRlW/JZIaUeUBGFfB8ZNEpPX//+5L6FoMUyGB\nUFDXRZCaYmEx7N7bQa+tHlo3ao2/fP9iDZXvlEWQBXa82IGX8S/ruigMwzAMU4ZztDMSchMQmRUp\n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\n","text/plain": ["<matplotlib.figure.Figure at 0x7fac91a9b240>"]},"metadata": {},"output_type": "display_data"}],"source": ["# select Year, Min, Max, Mean columns, group by year, average and line plot\n","\n","tmin_df[['Year','Min', 'Mean', 'Max']].groupby('Year').mean().plot( kind='line', figsize=(16, 4))"]},{"cell_type": "markdown","metadata": {},"source": ["The result above has a fair amount of variation, but does seem to indicate that the minimum temperature, at least, has been on the rise the past 20 years. \n","\n","Note that if you wanted to get the same graph without using Jupyter notebook and matplotlib, you could use still use pandas, but write to a csv or excel file using the data frame's `to_csv` or `to_excel` methods. Then you could load the resulting file into a spreadsheet and graph from there. "]}],"metadata": {"kernelspec": {"display_name": "Python 3 case study","language": "python","name": "python3_cs"},"language_info": {"codemirror_mode": {"name": "ipython","version": 3},"file_extension": ".py","mimetype": "text/x-python","name": "python","nbconvert_exporter": "python","pygments_lexer": "ipython3","version": "3.6.3+"},"toc": {"nav_menu": {},"number_sections": true,"sideBar": true,"skip_h1_title": false,"toc_cell": false,"toc_position": {},"toc_section_display": "block","toc_window_display": false}},"nbformat": 4,"nbformat_minor": 2}