Laura and I would like to have the wedding outdoors. Naturally, this means that weather will play a significant factor. To get some idea of what the weather will be like on the big day, I whipped up some Python to calculate local average temperature, rainfall, and wind speed for the time surrounding April 5th.
![](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tU7TeZa7hQI9i89kRean4FSKJQrEbTAjXwNbxIs_2b1paP88M6pchRASxpKMC7JLlynosN9URGhEurpTjQlE9cQlom_yEvjY8mkMLGXlp252xchtVX655EJOi4bDIAiQKwYojKp8nTgBa4ZXBsw-06IZP_yWrxXZf-Nd5PaZ_R2fqv2C8SXSecx7TofOXv29D_NI1wNfL0s57VjdInyHOeZdRCV_ibck7qPOcUCpMaTO2BuEmHeslPSteISE7d0UR6J4vVBLty7zZLspU=s0-d)
Clearly the best times are in the morning and the evening. The evening is probably best since it's about 10 degrees warmer at 20:00 than 8:00 and the wind speed drops steadily after 19:00.
import csvHere's the results for April 5th over the past 5 years:
import urllib2
STATION_ID = 'KNCOAKIS1'
WEATHER_URL = \
'http://www.wunderground.com/weatherstation/WXDailyHistory.asp?'
REQUEST_DATA = {
'ID': STATION_ID,
'format': 1,
'year': None,
'month': None,
'day': None,
}
def _GetRequestData(year, month, day):
request_data = REQUEST_DATA.copy()
request_data['year'] = year
request_data['month'] = month
request_data['day'] = day
return request_data
def GetDayStats(year, month, day):
request_data = _GetRequestData(year, month, day)
get_data = '&'.join('%s=%s' % (k, v) for k, v in request_data.items())
url = WEATHER_URL + get_data
data = urllib2.urlopen(url).read()
# Have to clean up the data because Weather Underground doesn't return a
# true CSV file. Instead, it has HTML markup in it :(
data.strip()
data = data.split('<br>')[:-1]
# Remove trailing whitespace and comma.
data = [r.strip()[:-1] for r in data]
reader = csv.DictReader(data)
averages = {
'TemperatureF': 0,
'WindSpeedMPH': 0,
'WindSpeedGustMPH': 0,
}
sums = {
'HourlyPrecipIn': 0,
}
mins = {
'WindSpeedMPH': [],
'WindSpeedGustMPH': [],
}
# DictReader has no __len__ defined. Have to keep count.
num_rows = 0
for row in reader:
num_rows += 1
for k in averages.keys():
averages[k] += float(row[k])
for k in sums.keys():
sums[k] += float(row[k])
for k in mins.keys():
mins[k].append((row['Time'], float(row[k])))
day_stats = {}
for k, v in averages.iteritems():
averages[k] = v / num_rows
day_stats.update(averages)
day_stats.update(sums)
for k in mins.keys():
values = mins[k][:]
values.sort(key=lambda x: x.__getitem__(1))
day_stats['Min%s' % k] = values[0]
return day_stats
def GetDayHistory(month, day, start_year, end_year):
days = []
for year in range(start_year, end_year + 1):
days.append(GetDayStats(year, month, day))
avg_stats = {}
min_times = []
for stats in days:
for k, v in stats.iteritems():
if isinstance(v, tuple):
min_times.append(v[0])
v = v[1]
avg_stats[k] = avg_stats.get(k, 0) + v
for k, v in avg_stats.iteritems():
avg_stats[k] = v / len(days)
return avg_stats, min_times
if __name__ == '__main__':
month = 4
for day in range(1, 8):
print 'History for %d/%d.' % (month, day)
print GetDayHistory(month, day, 2003, 2007)
History for 4/5.From this data, it's obvious that rain and temperature shouldn't be a problem. The biggest problem will be the wind. Here are the relevant weather charts for April 5th, 2007 (unfortunately, 2008 is not available).
({
'TemperatureF': 61.136611720960197,
'WindSpeedMPH': 7.3304707160832763,
'WindSpeedGustMPH': 11.706614130829021,
'MinWindSpeedGustMPH': 0.0,
'MinWindSpeedMPH': 0.0,
'HourlyPrecipIn': 0.0
},
['2003-04-05 00:30:02', '2003-04-05 01:30:03',
'2004-04-05 04:45:01', '2004-04-05 20:15:01',
'2005-04-05 02:30:04', '2005-04-05 03:00:01',
'2006-04-05 20:45:01', '2006-04-05 14:45:01',
'2007-04-05 21:30:00', '2007-04-05 22:45:00'])
Clearly the best times are in the morning and the evening. The evening is probably best since it's about 10 degrees warmer at 20:00 than 8:00 and the wind speed drops steadily after 19:00.