def tempContingencyTable(forecasts, observations, start_date, end_date, temp="H", stations=None, shift=None, period=None):
    """
    tempContingencyTable()
    Purpose:    Produce a continuous contingency table containing all the temperature forecasts for the period.
    Parameters: forecasts [type=dictionary]
                    Dictionary mapping shift days (e.g. 'Tue_Aft' for Tuesday Afternoon) to their OWLShift objects.
                observations [type=dictionary]
                    Dictionary mapping observation points (e.g. 'OUN' for Norman) to their ASOS objects.
                start_date [type=string]
                    String containing the date of the start of the verification period (format is 'YYYYMMDD_HH:MM').
                end_date [type=string]
                    String containing the date of the end of the verification period (format is 'YYYYMMDD_HH:MM', same as in start_date).
                temp [type=string]
                    String telling whether the high or low temperature is being evaluated.  "H" for high and "L" for low.
                stations [type=list,tuple,string]
                    A station or list of stations to include in the contingency table.  Optional, defaults to KOUN if not given.
                shift [type=string]
                    The shift to verify (e.g. 'Tue_Aft' for Tuesday Afternoon).  Not implemented yet.
                period [type=string]
                    The period to verify (one of '1A', '1B', '2', '3', or '4').  Optional, defaults to '1A' if not given.
    Returns:    The completed contingency table as a ContinuousContingencyTable object.
    """
    temp_ct = ContinuousContingencyTable(np.array([]),np.array([]))
    if period is None:
        period = OWLShift._forecast_days[0]

    if stations is None:
        stations = observations.keys()
    elif type(stations) not in [ list, tuple ]:
        stations = [ stations ]

    for shift_name, shift_data in forecasts.iteritems():
        for stn in stations:
            if temp.upper()=="H":
                temp_fcasts = shift_data.getForecasts(period, start_date, end_date, "TMPH", verif_to_fcst[stn])
            else:
                temp_fcasts = shift_data.getForecasts(period, start_date, end_date, "TMPL", verif_to_fcst[stn])
            
            shift_start_times, shift_end_times = temp_fcasts[:2]
            if temp.upper()=="H":
                temp_obs = observations[stn].getHighTemps(shift_start_times,shift_end_times)
                high_idxs = np.nonzero(temp_obs > 150)
                if len(high_idxs[0]) > 0:
                    print shift_start_times[high_idxs],temp_obs[high_idxs]
            else:
                temp_obs = observations[stn].getLowTemps(shift_start_times,shift_end_times)
            temp_ct.addPairs(temp_fcasts[2],temp_obs)
            
    return temp_ct
def windContingencyTable(forecasts, observations, start_date, end_date, winds="max", stations=None, shift=None, period=None):
    """
    windContingencyTable()
    Purpose:    Produce a continuous contingency table containing all the wind forecasts for the period.
    Parameters: forecasts [type=dictionary]
                    Dictionary mapping shift days (e.g. 'Tue_Aft' for Tuesday Afternoon) to their OWLShift objects.
                observations [type=dictionary]
                    Dictionary mapping observation points (e.g. 'OUN' for Norman) to their ASOS objects.
                start_date [type=string]
                    String containing the date of the start of the verification period (format is 'YYYYMMDD_HH:MM').
                end_date [type=string]
                    String containing the date of the end of the verification period (format is 'YYYYMMDD_HH:MM', same as in start_date).
                winds [type=string]
                    String telling whether the high or low temperature is being evaluated.  "H" for high and "L" for low.
                stations [type=list,tuple,string]
                    A station or list of stations to include in the contingency table.  Optional, defaults to KOUN if not given.
                shift [type=string]
                    The shift to verify (e.g. 'Tue_Aft' for Tuesday Afternoon).  Not implemented yet.
                period [type=string]
                    The period to verify (one of '1A', '1B', '2', '3', or '4').  Optional, defaults to '1A' if not given.
    Returns:    The completed contingency table as a ContinuousContingencyTable object.
    """
    wind_ct = ContinuousContingencyTable(np.array([]),np.array([]))
    if period is None:
        period = OWLShift._forecast_days[0]

    if stations is None:
        stations = observations.keys()
    elif type(stations) not in [ list, tuple ]:
        stations = [ stations ]

    for shift_name, shift_data in forecasts.iteritems():
        for stn in stations:
            if stn == 'KHHW' or stn == 'HHW':
                pass
            else:
                if winds.upper()=="MAX":
                    wind_fcasts = shift_data.getForecasts(period, start_date, end_date, "WSHI", verif_to_fcst[stn])
                else:
                    wind_fcasts = shift_data.getForecasts(period, start_date, end_date, "WSLO", verif_to_fcst[stn])

                shift_start_times, shift_end_times = wind_fcasts[:2]
                if winds.upper()=="MAX":
                    wind_obs = observations[stn].getMaxWinds(shift_start_times,shift_end_times)
                else:
                    wind_obs = observations[stn].getMinWinds(shift_start_times,shift_end_times)
                wind_ct.addPairs(wind_fcasts[2],wind_obs)
    return wind_ct