Ozone levels are generally lower in urban than in rural areas. The difference is shown by box plots summarising ozone levels for urban and rural background site types; the red line represents mean values.
The urban decrement is due to local scavenging of ozone by nitric oxide (NO) from motor vehicle exhaust. The complex relationship between ozone and nitrogen oxides (NOx) may underlie their widely differing seasonal trends:
Ozone levels are highly variable due to a large dependence on the weather. This can be seen in the large year-to-year variability in levels recorded at a rural and an urban background site:
Data from the background site Harwell shows a significant correlation between daily maximum temperatures and maximum ozone concentrations.
Plotting diurnal variations in temperature and ozone levels shows a high degree of similarity between them:
Any causal link with temperature is likely to only be partial, since temperature also relates to other variables such as atmospheric stability and sunlight. Since ozone formation is driven by UV radiation, episodes of high ozone levels typically occur in summer.
The following scatter plot shows the number of hours with ozone concentrations above 160 μg/m3 for rural background sites across the UK, as a function of distance along a north-westerly co-ordinate. It shows a trend of decreased occurrences with an increased north-westerly distance.
Data points are grouped by altitude, which is influential. Sites with an altitude of 100 to 200 metres show a significant negative correlation (R2=0.96).
Analysis in Python
To calculate daily maximum values from hourly data points, the date column within the pandas DataFrame first needs to be converted into a datetime object and then set as the index.The pandas groupby() method is useful when analysing a pandas Series according to a certain category. In this case the Series of interest are ‘ozone’ and ‘temp’. These are grouped according to day, whose values could be specified by passing a Series as an argument to groupby(). In this case, pandas.TimeGrouper generates the values from the datetime index.
Different time periods could be specified, e.g. using ‘M’ for monthly data. Applying the max() method to the columns of interest returns Series containing daily maximum values, indexed by day.
To obtain max. ozone concentrations for each 1°C increment in daily max. temperature, a new DataFrame must first be created from these Series (after setting ‘Tmax’ values as integers). This allows the max. ozone values for each day to be grouped by daily max. temperature; using the max() method on the ‘O3max’ column returns a Series containing the max. ozone values for each daily max. temperature between 10 and 27°C. This data can then be plotted using a library such as matplotlib.
Alternatively, the agg() method could have been used, allowing a range of other statistical functions to be applied: