Calculating global mean temperature timeseriesΒΆ

In this recipe we will calculate and plot monthly and annual global mean temperature timeseries.

  1. Import cf-python and cf-plot:

import cfplot as cfp

import cf
  1. Read the field constructs:

f = cf.read("~/recipes/cru_ts4.06.1901.2021.tmp.dat.nc")
print(f)
[<CF Field: ncvar%stn(long_name=time(1452), long_name=latitude(360), long_name=longitude(720))>,
 <CF Field: long_name=near-surface temperature(long_name=time(1452), long_name=latitude(360), long_name=longitude(720)) degrees Celsius>]
  1. Select near surface temperature by index and look at its contents:

temp = f[1]
print(temp)
Field: long_name=near-surface temperature (ncvar%tmp)
-----------------------------------------------------
Data            : long_name=near-surface temperature(long_name=time(1452), long_name=latitude(360), long_name=longitude(720)) degrees Celsius
Dimension coords: long_name=time(1452) = [1901-01-16 00:00:00, ..., 2021-12-16 00:00:00] gregorian
                : long_name=latitude(360) = [-89.75, ..., 89.75] degrees_north
                : long_name=longitude(720) = [-179.75, ..., 179.75] degrees_east
  1. Select latitude and longitude dimensions by identities, with two different techniques:

lon = temp.coordinate("long_name=longitude")
lat = temp.coordinate("Y")
  1. Print the description of near surface temperature using the dump method to show properties of all constructs:

-----------------------------------------------------
Field: long_name=near-surface temperature (ncvar%tmp)
-----------------------------------------------------
Conventions = 'CF-1.4'
_FillValue = 9.96921e+36
comment = 'Access to these data is available to any registered CEDA user.'
contact = 'support@ceda.ac.uk'
correlation_decay_distance = 1200.0
history = 'Fri 29 Apr 14:35:01 BST 2022 : User f098 : Program makegridsauto.for
           called by update.for'
institution = 'Data held at British Atmospheric Data Centre, RAL, UK.'
long_name = 'near-surface temperature'
missing_value = 9.96921e+36
references = 'Information on the data is available at
              http://badc.nerc.ac.uk/data/cru/'
source = 'Run ID = 2204291347. Data generated from:tmp.2204291209.dtb'
title = 'CRU TS4.06 Mean Temperature'
units = 'degrees Celsius'

Data(long_name=time(1452), long_name=latitude(360), long_name=longitude(720)) = [[[--, ..., --]]] degrees Celsius

Domain Axis: long_name=latitude(360)
Domain Axis: long_name=longitude(720)
Domain Axis: long_name=time(1452)

Dimension coordinate: long_name=time
    calendar = 'gregorian'
    long_name = 'time'
    units = 'days since 1900-1-1'
    Data(long_name=time(1452)) = [1901-01-16 00:00:00, ..., 2021-12-16 00:00:00] gregorian

Dimension coordinate: long_name=latitude
    long_name = 'latitude'
    units = 'degrees_north'
    Data(long_name=latitude(360)) = [-89.75, ..., 89.75] degrees_north

Dimension coordinate: long_name=longitude
    long_name = 'longitude'
    units = 'degrees_east'
    Data(long_name=longitude(720)) = [-179.75, ..., 179.75] degrees_east
  1. Latitude and longitude dimension coordinate cell bounds are absent, which are created and set:

Dimension coordinate: long_name=latitude
    long_name = 'latitude'
    units = 'degrees_north'
    Data(360) = [-89.75, ..., 89.75] degrees_north
    Bounds:units = 'degrees_north'
    Bounds:Data(360, 2) = [[-90.0, ..., 90.0]] degrees_north
Dimension coordinate: long_name=longitude
    long_name = 'longitude'
    units = 'degrees_east'
    Data(720) = [-179.75, ..., 179.75] degrees_east
    Bounds:units = 'degrees_east'
    Bounds:Data(720, 2) = [[-180.0, ..., 180.0]] degrees_east
print(b.array)
[[-180.  -179.5]
 [-179.5 -179. ]
 [-179.  -178.5]
 ...
 [ 178.5  179. ]
 [ 179.   179.5]
 [ 179.5  180. ]]
  1. Time dimension coordinate cell bounds are similarly created and set for cell sizes of one calendar month:

time = temp.coordinate("long_name=time")
c = time.create_bounds(cellsize=cf.M())
time.set_bounds(c)
time.dump()
Dimension coordinate: long_name=time
    calendar = 'gregorian'
    long_name = 'time'
    units = 'days since 1900-1-1'
    Data(1452) = [1901-01-16 00:00:00, ..., 2021-12-16 00:00:00] gregorian
    Bounds:calendar = 'gregorian'
    Bounds:units = 'days since 1900-1-1'
    Bounds:Data(1452, 2) = [[1901-01-01 00:00:00, ..., 2022-01-01 00:00:00]] gregorian
  1. Calculate and plot the area weighted mean surface temperature for each time:

global_avg = temp.collapse("area: mean", weights=True)
cfp.lineplot(global_avg, color="red", title="Global mean surface temperature")
Global mean surface temperature
  1. Calculate and plot the annual global mean surface temperature:

annual_global_avg = global_avg.collapse("T: mean", group=cf.Y())
cfp.lineplot(
    annual_global_avg,
    color="red",
    title="Annual global mean surface temperature",
)
Annual global mean surface temperature

Total running time of the script: ( 0 minutes 48.006 seconds)

Gallery generated by Sphinx-Gallery